- 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 (\le≤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 // 2 // main.c 3 // 5-1 Build A Binary Search Tree 4 // 5 // Created by 余南龙 on 2016/10/26. 6 // Copyright ? 2016年 余南龙. All rights reserved. 7 // 8 9 #include <stdio.h> 10 #include <stdlib.h> 11 12 typedef struct node BST; 13 struct node{ 14 int key; 15 struct node *l_child, *r_child; 16 }; 17 18 BST *T; 19 int *inorder, *val; 20 int j = 0; 21 22 int Comp(const void *a, const void *b){ 23 return *(int*)a - *(int*)b; 24 } 25 26 void Inorder(BST *root){ 27 if(NULL == root){ 28 return; 29 } 30 31 Inorder(root->l_child); 32 root->key = val[j]; 33 j++; 34 Inorder(root->r_child); 35 } 36 37 int main(void) { 38 int size, i, l_child, r_child, tail = 1; 39 BST *Q; 40 int *visit; 41 42 scanf("%d", &size); 43 T = (BST*)malloc(sizeof(BST) * size); 44 Q = (BST*)malloc(sizeof(BST) * size); 45 val = (int*)malloc(sizeof(int) * size); 46 inorder = (int*)malloc(sizeof(int) * size); 47 visit = (int*)calloc(size, sizeof(int)); 48 for(i = 0; i < size; i++){ 49 scanf("%d%d", &l_child, &r_child); 50 if(-1 != l_child){ 51 T[i].l_child = T + l_child; 52 visit[l_child] = 1; 53 } 54 else{ 55 T[i].l_child = NULL; 56 } 57 if(-1 != r_child){ 58 T[i].r_child = T + r_child; 59 visit[r_child] = 1; 60 } 61 else{ 62 T[i].r_child = NULL; 63 } 64 } 65 for(i = 0; i < size; i++){ 66 scanf("%d", val + i); 67 } 68 qsort(val, size, sizeof(int), Comp); 69 for(i = 0; i < size; i++){ 70 if(0 == visit[i]){ 71 break; 72 } 73 } 74 Inorder(T + i); 75 Q[0] = T[i]; 76 for(i = 0; i < size; i++){ 77 if(0 == i){ 78 printf("%d", Q[i].key); 79 } 80 else{ 81 printf(" %d", Q[i].key); 82 } 83 84 if(NULL != Q[i].l_child){ 85 Q[tail++] = *(Q[i].l_child); 86 } 87 if(NULL != Q[i].r_child){ 88 Q[tail++] = *(Q[i].r_child); 89 } 90 } 91 92 return 0; 93 }