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 42Sample Output:
58 25 82 11 38 67 45 73 42
题目大意
首先给你一颗n个节点BST,再给你n个不同的整数,让你将这n个不同的整数填入BAT中,保证只有一种结果。
题目解析
这道题考点还是建树和树的遍历,这就不提了。
有个坑点是(可能是对我自己来说的坑点):我习惯用数组来记每个数的位置,但是这道题的数据应该有几个是,树的层数比较高,用(i<<1,i<<1+1)表示左右子树可能会超long long,因此最后层序遍历的时候,没有用结构体sort,而用了普遍的广搜就AC了。
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cstdlib>
#include <climits>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
const int MAXN = 1000 + 5;
const int MAXM = 100000 + 5;
const int INF = 0x7f7f7f7f;
const int dir[][2] = {0,1,1,0,0,-1,-1,0};
template <class XSD> inline XSD f_min(XSD a, XSD b) { if (a > b) a = b; return a; }
template <class XSD> inline XSD f_max(XSD a, XSD b) { if (a < b) a = b; return a; }
int n;
struct TREE{
int l, r;
int num;
}tree[MAXN];
int a[MAXN], cnt;
void In_order(int root){
if(tree[root].l!=-1) In_order(tree[root].l);
tree[root].num=a[cnt++];
if(tree[root].r!=-1) In_order(tree[root].r);
}
void Solve(){
///中序遍历
In_order(0);
///输出
int ans[MAXN], ct=0;
queue<int>q;
q.push(0);
while(!q.empty()){
int top=q.front();
q.pop();ans[ct++]=tree[top].num;
if(tree[top].l!=-1) q.push(tree[top].l);
if(tree[top].r!=-1) q.push(tree[top].r);
}
for(int i=0; i<ct; i++) printf("%d%c", ans[i], i==(ct-1)?'\n':' ');
}
void Getdata(){
int x, y;
for(int i=0; i<n; i++){
scanf("%d%d", &x, &y);
tree[i].l = tree[i].r = -1;
if(x!=-1) tree[i].l=x;
if(y!=-1) tree[i].r=y;
}
cnt=0;
for(int i=0; i<n; i++) scanf("%d", &a[i]);
sort(a, a+n);
}
int main(){
while(~scanf("%d", &n)){
Getdata();
Solve();
}
return 0;
}