• PAT-A 1099.Build A Binary Search Tree


    1099. Build A Binary Search Tree

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:

    • The left subtree of a node contains only nodes with keys less than the node's key.
    • The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
    • Both the left and right subtrees must also be binary search trees.

    Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (<=100) which is the total number of nodes in the tree. The next N lines each contains the left and the right children of a node in the format "left_index right_index", provided that the nodes are numbered from 0 to N-1, and 0 is always the root. If one child is missing, then -1 will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.

    Output Specification:

    For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.

    Sample Input:

    9
    1 6
    2 3
    -1 -1
    -1 4
    5 -1
    -1 -1
    7 -1
    -1 8
    -1 -1
    73 45 11 58 82 25 67 38 42
    

    Sample Output:

    58 25 82 11 38 67 45 73 42
    

    程序代码:

    #include<stdio.h>
    #include<stdlib.h>
    #define MAX 100
    typedef struct
    {
    	int data;
    	int left;
    	int right;
    }node;
    typedef struct
    {
    	node value[MAX];
    	int top;
    	int bom;
    }queue;
    void initQueue(queue* s);
    void push(queue* s,node tmp);
    node pop(queue* s);
    void layerPrint(node a[],int len);
    int isEmptyQueue(queue*s);
    int num[MAX];
    int k=0;
    int comp(const void* a,const void* b);
    void inOrderVisit(node*p,int* num);
    node a[MAX];
    int main()
    {	
    	int num[MAX];
    	int n,i;
    	int cnt;
    	scanf("%d",&n);
    	for(i=0;i<n;i++)
    	{
    		scanf("%d%d",&a[i].left,&a[i].right);
    	}
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",&num[i]);
    	}
    	qsort(num,n,sizeof(int),comp);
          	inOrderVisit(&a[0],num);
    	layerPrint(a,n);
    	return 0;
    }
    void inOrderVisit(node*p,int* num)		//中序遍历填充节点值
    {
    	
    	if(p->left!=-1)
    		inOrderVisit(&a[p->left],num);
    	p->data = num[k++];
    	if(p->right!=-1)
    		inOrderVisit(&a[p->right],num);
    	return ;
    }
    void layerPrint(node a[],int len)		//层序遍历打印节点值
    {
    	int count=0;
    	queue q;
    	node p;
    	initQueue(&q);
    	push(&q,a[0]);
    	while(q.top!=q.bom)
    	{
    		p = pop(&q);
    		printf("%d",p.data);
    		count++;
    		if(count!=len)
    			putchar(' ');
    		if(p.left!=-1)	
    			push(&q,a[p.left]);
    		if(p.right!=-1)
    			push(&q,a[p.right]);
    	}
    }
    int comp(const void* a,const void* b)
    {
    	return *(int*)a -*(int*)b;
    }
    //队列的相关操作
    void initQueue(queue* s)
    {
    	s->top = 0;
    	s->bom = 0;
    }
    void push(queue* s,node tmp)
    {
    	s->value[s->top]=tmp;
    	s->top++;
    }
    node pop(queue* s)
    {
    	node tmp ;
    	tmp = s->value[s->bom];
    	s->bom++;
    	return tmp;
    }
    int isEmptyQueue(queue*s)
    {
    	if(s->top==s->bom)
    		return 1;
    	return 0;
    }
    
    
  • 相关阅读:
    愿你始终不移真心
    beautiful sentences
    (转)Design Pattern 新解(非常经典贴近生活)
    简述.Net下的应用程序授权。(转)
    thin的调试汇集
    Asp.net1.0 升级 ASP.NET 2.0 的几个问题总结 (转)
    Microsoft .NET Pet Shop 4 架构与技术分析 (转)
    面向对象编程,我的思想[上](转)
    七个问题:经济学常识 (转),真的很好,值的思考
    .NET控件收集(转)
  • 原文地址:https://www.cnblogs.com/zhengkang/p/5734332.html
Copyright © 2020-2023  润新知