本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90701125
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 (≤) 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 − will represent the NULL child pointer. Finally Ndistinct 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
题目大意:将N个数放入一棵定型了的二叉树,使其满足二叉搜索树的性质。
思路:先将数据Data排好序,二叉树中存放数据的下标就行。
对于BST中的每个节点,它的key值对应的下标 index = 其上层节点传递过来的 M - 其右子树节点的个数 rightNum。若当前节点是其parent节点的左孩子,这个传递过来的M值就是parent节点的下标;若当前节点是parent节点的右孩子,那么M就是其parent节点的M。根节点的M值为N-1。
1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 struct node { 7 int left, right, 8 rightNum, 9 index; 10 }; 11 vector <node> tree; 12 vector <int> Data; 13 int getNum(int t); 14 void getIndex(int t, int M); 15 void levelOrder(int t); 16 int main() 17 { 18 int N; 19 scanf("%d", &N); 20 tree.resize(N); 21 for (int i = 0; i < N; i++) 22 scanf("%d%d", &tree[i].left, &tree[i].right); 23 Data.resize(N); 24 for (int i = 0; i < N; i++) 25 scanf("%d", &Data[i]); 26 sort(Data.begin(), Data.end()); 27 getIndex(0, N - 1); 28 levelOrder(0); 29 return 0; 30 } 31 void levelOrder(int t) { 32 queue <int> Q; 33 Q.push(t); 34 while (!Q.empty()) { 35 t = Q.front(); 36 Q.pop(); 37 printf("%d", Data[tree[t].index]); 38 if (tree[t].left != -1) 39 Q.push(tree[t].left); 40 if (tree[t].right != -1) 41 Q.push(tree[t].right); 42 if (!Q.empty()) 43 printf(" "); 44 } 45 } 46 void getIndex(int t, int M) { 47 if (t == -1) { 48 return; 49 } 50 tree[t].rightNum = getNum(tree[t].right); 51 tree[t].index = M - tree[t].rightNum; 52 getIndex(tree[t].left, tree[t].index - 1); 53 getIndex(tree[t].right, M); 54 } 55 int getNum(int t) { 56 if (t == -1) 57 return 0; 58 return getNum(tree[t].left) + getNum(tree[t].right) + 1; 59 }