1099. Build A Binary Search Tree (30)
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
https://www.patest.cn/contests/pat-a-practise/1099
思路:
中序遍历序列即升序序列。
首先得出中序遍历序列,然后将排好序的数填入,最后按层序输出。
CODE:
#include<iostream>
#include<vector>
#include<algorithm>
#define N 110
using namespace std;
typedef struct S
{
int bh;
int val;
int ls;
int rs;
int num;
};
S ori[N];
vector<S> pt;
int in[N];
int sum;
void dfs(int n,int flo)
{
if (ori[n].ls!=-1) dfs(ori[n].ls,flo+1);
ori[n].bh=flo;
ori[n].num=sum;
sum++;
pt.push_back(ori[n]);
if (ori[n].rs!=-1) dfs(ori[n].rs,flo+1);
}
bool cmp(S a, S b)
{
if (a.bh==b.bh)
return a.num<b.num;
else
return a.bh<b.bh;
}
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>ori[i].ls>>ori[i].rs;
}
for (int i=0;i<n;i++)
cin>>in[i];
sum=0;
dfs(0,0);
sort(in,in+n);
for (int i=0;i<n;i++)
{
// cout<<pt[i].bh<<" "<<in[i]<<endl;
pt[i].val=in[i];
}
//cout<<endl;
sort(pt.begin(),pt.end(),cmp);
for (int i=0;i<n;i++)
{
if (i!=0) cout<<" ";
cout<<pt[i].val;
}
return 0;
}