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
solution:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct node *tree;
struct node
{
int val;
tree left,right;
};
int cnt=0;
void built(tree root,vector<int>&num)
{
if(root==NULL)return;
built(root->left,num);
root->val=num[cnt++];
built(root->right,num);
}
int main()
{
int n;cin>>n;
tree root=new node;
root->left=root->right=NULL;
vector<pair<int,int> >a(n);
set<int>s;
for(int i=0;i<n;i++)
{
cin>>a[i].first>>a[i].second;
if(a[i].first!=-1)s.insert(a[i].first);
if(a[i].second!=-1)s.insert(a[i].second);
}
for(int i=0;i<n;i++)
{
if(!s.count(i))
{
root->val=i;
break;
}
}
function<void(tree)> build=[&](tree root)->void
{
if(root==nullptr)return;
if(a[root->val].first!=-1)
{
tree l=new node;
l->left=l->right=nullptr;
l->val=a[root->val].first;
root->left=l;
}
if(a[root->val].second!=-1)
{
tree r=new node;
r->left=r->right=nullptr;
r->val=a[root->val].second;
root->right=r;
}
build(root->left),build(root->right);
};
build(root);
vector<int>num(n);
for(int i=0;i<n;i++)cin>>num[i];
sort(num.begin(),num.end());
built(root,num);
queue<tree>q;
q.push(root);
vector<int>ans;
while(!q.empty())
{
tree tmp=q.front();
q.pop();
ans.push_back(tmp->val);
if(tmp->left)q.push(tmp->left);
if(tmp->right)q.push(tmp->right);
}
for(int i=0;i<ans.size();i++)
{
if(i)cout<<' ';
cout<<ans[i];
}
}
思路:首先根据给出的结点建立二叉树本身,之后按照给出的数字排序后以中序遍历的方式建立二叉搜索树。build函数是建树,built函数是将二叉搜索树数据读入已有的树。

435

被折叠的 条评论
为什么被折叠?



