本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90701125

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 (≤) 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 − will represent the NULL child pointer. Finally Ndistinct 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

题目大意:将N个数放入一棵定型了的二叉树,使其满足二叉搜索树的性质。

思路:先将数据Data排好序,二叉树中存放数据的下标就行。

对于BST中的每个节点,它的key值对应的下标 index = 其上层节点传递过来的 M - 其右子树节点的个数 rightNum。若当前节点是其parent节点的左孩子,这个传递过来的M值就是parent节点的下标;若当前节点是parent节点的右孩子,那么M就是其parent节点的M。根节点的M值为N-1。

 #include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
struct node {
int left, right,
rightNum,
index;
};
vector <node> tree;
vector <int> Data;
int getNum(int t);
void getIndex(int t, int M);
void levelOrder(int t);
int main()
{
int N;
scanf("%d", &N);
tree.resize(N);
for (int i = ; i < N; i++)
scanf("%d%d", &tree[i].left, &tree[i].right);
Data.resize(N);
for (int i = ; i < N; i++)
scanf("%d", &Data[i]);
sort(Data.begin(), Data.end());
getIndex(, N - );
levelOrder();
return ;
}
void levelOrder(int t) {
queue <int> Q;
Q.push(t);
while (!Q.empty()) {
t = Q.front();
Q.pop();
printf("%d", Data[tree[t].index]);
if (tree[t].left != -)
Q.push(tree[t].left);
if (tree[t].right != -)
Q.push(tree[t].right);
if (!Q.empty())
printf(" ");
}
}
void getIndex(int t, int M) {
if (t == -) {
return;
}
tree[t].rightNum = getNum(tree[t].right);
tree[t].index = M - tree[t].rightNum;
getIndex(tree[t].left, tree[t].index - );
getIndex(tree[t].right, M);
}
int getNum(int t) {
if (t == -)
return ;
return getNum(tree[t].left) + getNum(tree[t].right) + ;
}

最新文章

  1. resolv.conf
  2. &lt;&lt;Differential Geometry of Curves and Surfaces&gt;&gt;笔记
  3. PS技能大全
  4. bootstrap-select去除蓝色边框outline
  5. DevExpress GridView对表格的部分说明
  6. php开发网站编码统一问题
  7. 取余运算(codevs 1497)
  8. java CS结构软件自动升级的实现
  9. xml基础学习笔记
  10. Excel VLOOKUP等使用记录
  11. h5前端流行的框架
  12. AOP入门(转)
  13. 如何發佈一個完整Node.js Module
  14. EF时,数据库字段和实体类不一致问题
  15. oracle 数据库去重复数据
  16. python数据结构-数组/列表/栈/队列及实现
  17. 2、JDBC-CURD
  18. egret list不显示问题
  19. mysql中varbinary、binary、char、varchar异同
  20. linux基础命令---chattr

热门文章

  1. linux命令学习笔记(50):crontab命令
  2. 【leetcode刷题笔记】Palindrome Partitioning
  3. LG3533 [POI2012]RAN-Rendezvous
  4. pip3 更改安装源
  5. Centos6.5 安装pip
  6. nginx中给目录增加密码保护实现程序
  7. centos7 中文乱码解决方法
  8. mkfs在特定的分区上建立 linux 文件系统
  9. netstat查看网络信息
  10. AngularJs(Part 6)