PAT甲级——1099 Build A Binary Search Tree (二叉搜索树)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90701125
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) + ;
}
最新文章
- resolv.conf
- <;<;Differential Geometry of Curves and Surfaces>;>;笔记
- PS技能大全
- bootstrap-select去除蓝色边框outline
- DevExpress GridView对表格的部分说明
- php开发网站编码统一问题
- 取余运算(codevs 1497)
- java CS结构软件自动升级的实现
- xml基础学习笔记
- Excel VLOOKUP等使用记录
- h5前端流行的框架
- AOP入门(转)
- 如何發佈一個完整Node.js Module
- EF时,数据库字段和实体类不一致问题
- oracle 数据库去重复数据
- python数据结构-数组/列表/栈/队列及实现
- 2、JDBC-CURD
- egret list不显示问题
- mysql中varbinary、binary、char、varchar异同
- linux基础命令---chattr