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

题目大意:给定一棵二叉查找树的树结构,和一组不同的数,那么就能形成唯一的一棵BST,给出这棵BST的层次遍历顺序。

我的AC代码,一遍过,开心。

#include <iostream>
#include <algorithm>
#include <map>
#include<queue>
#include<vector>
using namespace std;
struct Node{
int data,left,right;
}node[]; int d[];
vector<int> in;
queue<int> level;
void inorder(int root){
if(node[root].left!=-)inorder(node[root].left);
in.push_back(root);
if(node[root].right!=-)inorder(node[root].right);
}
int main()
{
int n;
cin>>n;
int left,right;
for(int i=;i<n;i++){
cin>>left>>right;
node[i].left=left;
node[i].right=right;
}
for(int i=;i<n;i++)
cin>>d[i];
sort(d,d+n);//从小到大排列即是中序遍历的结果。
inorder();
for(int i=;i<n;i++){
node[in[i]].data=d[i];//安排进去了
}
//接下来层次遍历了。
level.push();
vector<int> lev;
while(!level.empty()){
int top=level.front();
level.pop();
lev.push_back(node[top].data);
if(node[top].left!=-)level.push(node[top].left);
if(node[top].right!=-)level.push(node[top].right);
}
cout<<lev[];
for(int i=;i<n;i++){
cout<<" "<<lev[i];
}
return ;
}

//猛一看觉得挺难,实际上要利用BST的性质就很好做了。 即中序遍历是数据从小到大排列的。

1.先对给出的二叉树结构,那么此时建树;

2.先对二叉树的下标进行中序遍历,并且将输入的数据从小到大排列,然后直接赋值就可以了。

3.再使用队列对其层次遍历即可。

最新文章

  1. HTML5 使用application cache 接口实现离线数据缓存
  2. 容易被忽略CSS特性
  3. DoTween NGUI bug
  4. 转载:关于 WebBrowser只对浏览器外应用程序以及在Internet Explorer 中以提升权限运行的应用程序启用
  5. 【ajax】xhr
  6. ACE_linux:任务 &amp; 命令(Task and Command)
  7. Android消息机制不完全解析(上)
  8. oracle中导出导入表以及数据
  9. Sharepoint 的定制 - 代码附加内容编辑器
  10. Struts2学习笔记(十)——自定义拦截器
  11. 部署 apply plugin: &#39;realm-android&#39;
  12. double 四舍五入保留一定的位数
  13. finally知识讲解
  14. 学习Android过程中遇到的未解决问题(个人笔记,细节补充,随时更新)
  15. vue中keep_alive使用
  16. sitemap index
  17. Jedis与Lua脚本结合
  18. display:inline-block与float
  19. AOP 貌似是拦截器 对方法进行拦截
  20. generator+列表生成式输出杨辉三角形

热门文章

  1. 在Javascript弹出窗口中输入换行符
  2. DFS应用——遍历有向图+判断有向图是否有圈
  3. 在dropDownList中实现既能输入一个新值又能实现下拉选的代码
  4. layui多选框
  5. iOS开发之--去除按钮的点击效果
  6. 用Broadcast Receiver刷新数据
  7. IOS开发经验总结(二)
  8. ios 将图片做成圆形
  9. 《从零开始学Swift》学习笔记(Day 66)——Cocoa Touch设计模式及应用之通知机制
  10. angular 2+ 路由守卫