题目

A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The lef 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 lef and right subtrees must also be binary search trees. A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from lef to right. Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT. You are supposed to output the level order traversal sequence of this BST.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding complete binary search tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input:

10

1 2 3 4 5 6 7 8 9 0

Sample Output:

6 3 8 1 5 7 9 0 2 4

题目分析

已知完全二叉查找树的序列,求其层序序列

解题思路

思路 01

  1. 输入测试用例,升序排序即为二叉查找树的中序序列
  2. 中序序列递归建树(存储与数组i节点的子节点为2*i,2*i+1,root在1位置)(模拟递归中序遍历过程)
  3. 顺序打印数组即为层序序列

思路 02

  1. 输入测试用例,升序排序即为二叉查找树的中序序列
  2. 中序序列递归建树(存储与数组i节点的子节点为2i,2i+1,root在1位置)(找root的坐标k,将中序序列划分为startk-1左子树和k+1end右子树)
  3. 顺序打印数组即为层序序列

知识点

完全二叉查找树,任意节点序列建树

注:二叉查找树(不一定要完全二叉树)任意节点序列,升序排序,即为二叉查找树的中序序列

  1. 方式一:模拟递归打印中序序列的过程,将中序序列依次插入到数组建树
  2. 方式二:找root在中序序列中的位置k并将root保存到数组,递归处理startk-1左子树和k+1end右子树,完成建树
void inOrder(int root) { //root保存在1位置,index初始化为0
if(root>n) return;
inOrder(root*2);
CBT[root]=number[index++];
inOrder(root*2+1);
}
void getLevel(int start, int end, int index) {
if(start>end)return;
int n=end-start+1;
int l=log(n+1)/log(2);//最后一层的层数
int leave=n-(pow(2,l)-1); //最后一层叶子结点数
//pow(2, l - 1) - 1是除了root结点所在层和最后?层外,左?树的结点个数,pow(2, l - 1) 是l+1
//层最多拥有的属于根结点左?树的结点个数,min(pow(2, l - 1), leave)是最后?个结点真正拥有的
//属于根结点左?树上的结点个数
int root = start+(pow(2,l-1)-1)+min((int)pow(2,l-1),leave);
level[index]=in[root];
getLevel(start,root-1,2*index+1);
getLevel(root+1,end,2*index+2); }

Code

Code 01

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1000;
int n,m;
int number[maxn],CBT[maxn],index=0;
void inOrder(int root) {
if(root>n) {
return;
}
inOrder(root*2);
CBT[root]=number[index++];
inOrder(root*2+1);
}
int main(int argc,char * argv[]) { scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%d",&m);
number[i]=m;
}
// 递增排序--二叉查找树中序序列
sort(number,number+n);
inOrder(1);//根节点在1位置
for(int i=1; i<=n;i++) {
if(i!=1)printf(" ");
printf("%d",CBT[i]);
}
return 0;
}

Code 02

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
vector<int> in,level;
void getLevel(int start, int end, int index) {
if(start>end)return;
int n=end-start+1;
int l=log(n+1)/log(2);//最后一层的层数
int leave=n-(pow(2,l)-1); //最后一层叶子结点数
//pow(2, l - 1) - 1是除了root结点所在层和最后?层外,左?树的结点个数,pow(2, l - 1) 是l+1
//层最多拥有的属于根结点左?树的结点个数,min(pow(2, l - 1), leave)是最后?个结点真正拥有的
//属于根结点左?树上的结点个数
int root = start+(pow(2,l-1)-1)+min((int)pow(2,l-1),leave);
level[index]=in[root];
getLevel(start,root-1,2*index+1);
getLevel(root+1,end,2*index+2); }
int main(int argc,char * argv[]) {
int n;
scanf("%d",&n);
in.resize(n);
level.resize(n);
for(int i=0; i<n; i++) {
scanf("%d",&in[i]);
}
sort(in.begin(),in.end());
getLevel(0,n-1,0);
printf("%d",level[0]);
for(int i=1; i<n; i++) {
printf(" %d",level[i]);
}
return 0;
}

PAT Advanced 1064 Complete Binary Search Tree (30) [⼆叉查找树BST]的更多相关文章

  1. PAT Advanced 1099 Build A Binary Search Tree (30) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  2. pat 甲级 1064. Complete Binary Search Tree (30)

    1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

  3. PAT 甲级 1064 Complete Binary Search Tree (30 分)(不会做,重点复习,模拟中序遍历)

    1064 Complete Binary Search Tree (30 分)   A Binary Search Tree (BST) is recursively defined as a bin ...

  4. PAT Advanced 1043 Is It a Binary Search Tree (25) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  5. 1064. Complete Binary Search Tree (30)【二叉树】——PAT (Advanced Level) Practise

    题目信息 1064. Complete Binary Search Tree (30) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B A Binary Search Tr ...

  6. PAT甲级:1064 Complete Binary Search Tree (30分)

    PAT甲级:1064 Complete Binary Search Tree (30分) 题干 A Binary Search Tree (BST) is recursively defined as ...

  7. PAT题库-1064. Complete Binary Search Tree (30)

    1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...

  8. pat 甲级 1064 ( Complete Binary Search Tree ) (数据结构)

    1064 Complete Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a binar ...

  9. PAT 甲级 1064 Complete Binary Search Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805407749357568 A Binary Search Tree ( ...

随机推荐

  1. 吴裕雄--天生自然java开发常用类库学习笔记:线程操作案例——生产者与消费者

    class Info{ // 定义信息类 private String name = "李兴华"; // 定义name属性 private String content = &qu ...

  2. Oracle-SQL 建表

    建立员工分类表: 员工分类表结构.内容分别如下图:   一.使用PL/SQL Dev 这类可视化工具直接创建表 1.建立表结构 新建-table-名称(egrade)    然后 列:创建表结构 2. ...

  3. 72.Python中ORM聚合函数详解:Avg,aggregate,annotate

    聚合函数: 如果你用原生SQL语句,则可以使用聚合函数提取数据.比如提取某个商品销售的数量,那么就可以使用Count,如果想要知道销售的平均价格,那么就可以使用Avg. 聚合函数是通过aggregat ...

  4. jqGrid 添加 合计行 footDate

    jQuery(table_id).jqGrid({ url : url,//组件创建完成之后请求数据的url datatype : "json",//请求数据返回的类型.可选jso ...

  5. rsync错误

    rsync error:No route to host rsync服务端开启的iptables防火墙 [root@nfs01 tmp]# rsync -avz /etc/hosts rsync_ba ...

  6. skLearn 支持向量机

    ## 版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Lear ...

  7. Centos 7 x86_64 环境Python2.7升级Python3.7.4

    升级Python3.7.4 #安装补丁包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...

  8. c++程序—浮点数

    #include<iostream> using namespace std; int main() { //2.单精度float //3.双精度double //默认情况下会输出6位有效 ...

  9. python 对axis的理解

    首先请看一下官方帮助的解释: 轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸.  注意看,官方对于0和1的解释是轴,也就是坐标轴.而坐标轴是有 ...

  10. POJ 3984:迷宫问题 bfs+递归输出路径

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11844   Accepted: 7094 Description ...