PTA 04-树6 Complete Binary Search Tree (30分)
题目地址
https://pta.patest.cn/pta/test/16/exam/4/question/669
5-7 Complete 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.
A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left 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 NN (\le 1000≤1000). Then NN 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
/*
评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2017-06-29 10:45 正在评测 0 5-7 gcc 无 无
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 18/18 1 1
测试点2 答案正确 3/3 2 1
测试点3 答案正确 2/2 1 1
测试点4 答案正确 2/2 1 1
测试点5 答案正确 3/3 1 1
测试点6 答案正确 2/2 3 1 完全二叉搜索树
结构:数组形式存储完全树,可以很方便进行层序遍历
解法:思考后发现完全二叉搜索树的子树也是完全二叉搜索树。故先将接收到的数据排序,递归计算一个节点的左子树和右子树数量,类似于快排,每次可以确定root的值。
然后按顺序打印数组即可。
*/ #include<stdio.h>
#define MAXLEN 2000 int workarray[MAXLEN];
int CBST[MAXLEN+1];//0号元素空着,从1号开始左子树2*root,右子树2*root+1;
int NODECOUNT[MAXLEN+1];
int Len;
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
} void InsertionSort(int A[],int N)
{
int i;
int k;
for(i=1;i<N;i++)
{
int temp=A[i];
k=i;
while(temp < A[k-1])
{
swap(&A[k],&A[k-1]);
k--;
}
A[k]=temp;
}
} void GetInput()
{
int i;
scanf("%d",&Len);
for(i=0;i<Len;i++)
{
scanf("%d",&workarray[i]);
}
} void Output()
{
int i;
for(i=1;i<Len+1;i++)
{
printf("%d",CBST[i]);
if(i!=Len)
printf(" ");
}
}
void Outputcount() //调试用函数
{
int i;
for(i=1;i<Len+1;i++)
{
printf("%d ",NODECOUNT[i]);
}
}
void Outputraw() //调试用函数
{
int i;
for(i=0;i<Len;i++)
{
printf("%d ",workarray[i]);
}
} void CountNodes() //太懒了,数据量不大,直接让它自己数节点数量得了。 逆序算出此节点之下所有子树节点之和
{
int i;
for(i=0;i<Len+1;i++)
{
NODECOUNT[i]=0;//先全体置零
} for(i=Len;i>0;i--)//在1开头的数组中,有效下标范围应该是1~Len
{
NODECOUNT[i/2] += NODECOUNT[i]+1; //父节点的子树,加上本节点的子树,再加上该节点自身
} } void CalcTree(int raw[],int calc[],int left,int index)
{
if (index>Len) return; //越界了,没子树
int raw_position=left+(2*index>Len?0:NODECOUNT[2*index]+1);//注,函数首次调用,left最初传入的是0, 判断是否为叶节点,如果没有左子树,那么它自己就是left
//此处加个注释说明下,一个坐标的构成。left(此递归段偏移起点)+NODECOUNT[2*index](所求的点的左儿子的全部结点数量)+1(该结点本身,即此递归段的root)
calc[index]=raw[raw_position];
CalcTree(raw,calc,left,2*index);//递归左子树
CalcTree(raw,calc,raw_position+1,2*index+1);//递归右子树
} int main()
{
GetInput();
InsertionSort(workarray,Len);
// printf("done sort\n");
// Outputraw();
// printf("\n");
CountNodes();
CalcTree(workarray,CBST,0,1);
Output();
printf("\n");
// Outputcount();
}
PTA 04-树6 Complete Binary Search Tree (30分)的更多相关文章
- PAT 甲级 1064 Complete Binary Search Tree (30 分)(不会做,重点复习,模拟中序遍历)
1064 Complete Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a bin ...
- PAT甲级:1064 Complete Binary Search Tree (30分)
PAT甲级:1064 Complete Binary Search Tree (30分) 题干 A Binary Search Tree (BST) is recursively defined as ...
- 1064 Complete Binary Search Tree (30分)(已知中序输出层序遍历)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- 04-树6 Complete Binary Search Tree (30 分)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- 【PAT甲级】1064 Complete Binary Search Tree (30 分)
题意:输入一个正整数N(<=1000),接着输入N个非负整数(<=2000),输出完全二叉树的层次遍历. AAAAAccepted code: #define HAVE_STRUCT_TI ...
- PAT题库-1064. Complete Binary Search Tree (30)
1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...
- pat04-树8. Complete Binary Search Tree (30)
04-树8. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHE ...
- pat1064. Complete Binary Search Tree (30)
1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...
- pat 甲级 1064. Complete Binary Search Tree (30)
1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...
随机推荐
- PHP设计模式 原型模式(Prototype)
定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...
- LN : leetcode 746 Min Cost Climbing Stairs
lc 746 Min Cost Climbing Stairs 746 Min Cost Climbing Stairs On a staircase, the i-th step has some ...
- vue中引入字体图标报错,找不到字体文件
在用vue + webpack进行开发的时候,在引用字体图标遇到字体无法加载的问题: 报以下错误 搞了好久没搞定,最后才找到解决方法(还是没有找到原因) 修改字体图标的css中引入字体文件的路径 以前 ...
- Linux服务器用iotop命令分析服务器磁盘IO情况
Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦.如果会systemtap, 或者blktrace这些事情 ...
- MATLAB学习总结(1)
MATLAB学习总结(1) path help path cd(current directory) savepath pathtool
- EOS Dapp体验报告
EOS Dapp体验报告 EOS通过并行链和DPOS的方式解决了延迟和数据吞吐量的难题. EOS能够实现每秒百万级的处理量,而目前比特币是每秒7笔,以太坊是30-40笔,EOS的这一超强能力吊打比特币 ...
- AWS Data Lake Service Stack
- java GZIP压缩与解压缩
1.GZIP压缩 public static byte[] compress(String str, String encoding) { if (str == null || str.length( ...
- MPP(大规模并行处理)简介
1. 什么是MPP? MPP (Massively Parallel Processing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和 ...
- caffe proto
所在目录为: /src/caffe/proto 在caffe.proto中定义了很多结构化数据,比如LayerParameter.Datum.NetParameter.SolverParameter. ...