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
思路:
这个题目要求输出二叉搜索树的层序遍历。我的思路是先建树,然后层次遍历即可。怎么建立一颗二叉搜索树呢?根据二叉搜索树的中序
遍历结果是有序的,所以进行中序遍历建立二叉树。题目中的输入告诉了我们二叉树的形状(每个结点的左右子女索引值都告诉我们了),所以
只需要对最后的一个key值序列进行排序,然后中序遍历赋值即可。
#include<iostream> #include<vector> #include<algorithm> #include<queue> #include<string> #include<map> #include<set> using namespace std; int tree[101]; //对树进行深度遍历 struct Node { int data; int lchild; int rchild; }; int k=0; void inOrder(Node node[],int key[],int i) { if(i!=-1) { inOrder(node,key,node[i].lchild); node[i].data=key[k++]; inOrder(node,key,node[i].rchild); } } vector<int> print; void level(Node node[]) { queue<int> q; q.push(0); while(!q.empty()) { int temp=q.front(); q.pop(); print.push_back(node[temp].data); if(node[temp].lchild!=-1) q.push(node[temp].lchild); if(node[temp].rchild!=-1) q.push(node[temp].rchild); } } int main() { int n; cin>>n; Node node[n]; for(int i=0;i<n;i++) { cin>>node[i].lchild>>node[i].rchild; } int key[n]; for(int i=0;i<n;i++) cin>>key[i]; sort(key,key+n); inOrder(node,key,0); level(node); cout<<print[0]; for(int i=1;i<print.size();i++) cout<<" "<<print[i]; return 0; }