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 }