pat1099. Build A Binary Search Tree (30)

1099. Build A Binary Search Tree (30)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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
    

提交代码

 

平衡二叉树。每次找到中间节点。

 1 #include<cstdio>
 2 #include<stack>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<stack>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 struct node{
10     int l,r,v;
11 };
12 node tree[105];
13 int line[105];
14 int calnum(int num){
15     if(num==-1){
16         return 0;
17     }
18     return calnum(tree[num].l)+calnum(tree[num].r)+1;
19     }
20 void BuildAVL(int mid,int *line){
21     if(mid==-1){
22         return ;
23     }
24     int count=calnum(tree[mid].l);//统计左子树
25 
26     //cout<<count<<endl;
27 
28     tree[mid].v=line[count];
29     BuildAVL(tree[mid].l,line);
30     BuildAVL(tree[mid].r,line+count+1);
31 }
32 int main(){
33     //freopen("D:\\INPUT.txt","r",stdin);
34     int n;
35     scanf("%d",&n);
36     int i;
37     for(i=0;i<n;i++){
38         scanf("%d %d",&tree[i].l,&tree[i].r);
39     }
40     for(i=0;i<n;i++){
41         scanf("%d",&line[i]);
42     }
43     sort(line,line+n);
44 
45     /*for(i=0;i<n;i++){
46         cout<<i<<" "<<line[i]<<endl;
47     }*/
48 
49     BuildAVL(0,line);
50 
51     //cout<<":"<<"  "<<tree[0].v<<endl;
52 
53     queue<int> q;
54     int cur;
55     q.push(0);
56     printf("%d",tree[0].v);
57     while(!q.empty()){
58         cur=q.front();
59         q.pop();
60         //cout<<"cur:  "<<cur<<endl;
61 
62         if(tree[cur].l!=-1){
63             q.push(tree[cur].l);
64             printf(" %d",tree[tree[cur].l].v);
65         }
66         if(tree[cur].r!=-1){
67             q.push(tree[cur].r);
68             printf(" %d",tree[tree[cur].r].v);
69         }
70     }
71     printf("\n");
72     return 0;
73 }

 

posted @ 2015-09-04 11:01  Deribs4  阅读(279)  评论(0编辑  收藏  举报