L3-010. 是否完全二叉搜索树

时间限制
400 ms

内存限制
65536 kB

代码长度限制
8000 B

判题程序
Standard

作者
陈越

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

输入格式:

输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。

输出格式:

将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出“YES”,如果该树是完全二叉树;否则输出“NO”。

输入样例1:

9
38 45 42 24 58 30 67 12 51

输出样例1:

38 45 24 58 42 30 12 67 51
YES

输入样例2:

8
38 24 12 45 58 67 42 51

输出样例2:

38 45 24 58 42 12 67 51
NO

题目链接:PAT L3.010

就是要判断是否是完全二叉树,百度了很久发现定义都不相同,而且一些定义简直难懂……找了个最简单的定义:加入放入n个数,层序遍历看1~n是否都出现过,这样可以保证节点集中在左侧也是对的,因为层序就是从左到右遍历,与是从左到右编号一致,可以BFS,也可以for循环。

举个例子,比如n=6时五个数分别为5,10,3,15,9,4,然后画出来的图应该是这样,左边满点右边最后一层少一个点

     5

10          3

15     9         4

总之就是对 [1,1<<n)的范围内的所有点进行遍历若在1~n中发现有某点未被赋值就是说这个点是缺失的,这棵树就不是完全二叉树,当然还要考虑数据范围,极端情况数组模拟会达到1<<20-1个点,

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=(1<<20)+7;
struct seg
{
int val=INF;
};
seg T[N]; auto init=[](){for (int i=0; i<N; ++i)T[i].val=INF;}; void add(int k,int val)
{
if(T[k].val==INF)
T[k].val=val;
else
{
if(val>T[k].val)
add(LC(k),val);
else
add(RC(k),val);
}
}
int main(void)
{
int n,i,v;
while (~scanf("%d",&n))
{
init();
for (i=1; i<=n; ++i)
{
scanf("%d",&v);
add(1,v);
}
int R=1<<n;
bool flag=true;
for (i=1; i<R; ++i)
{
if(T[i].val==INF)
{
if(i<=n)
flag=false;
}
else
printf("%s%d",i==1?"":" ",T[i].val);
}
putchar('\n');
puts(flag?"YES":"NO");
}
return 0;
}

最新文章

  1. [LeetCode] Longest Palindrome 最长回文串
  2. [fortify] open redirect漏洞
  3. Hibernate(八)__级联操作、struts+hibernate+接口编程架构
  4. 争夺 &amp; KM思想
  5. JS如何判断包括IE11在内的IE浏览器 &lt;转载&gt;
  6. U3D 飞机大战(MVC模式)解析--面向对象编程思想
  7. struts2.1笔记03:AOP编程和拦截器概念的简介
  8. oracle数据库使用之数据查询入门
  9. 自定义view(二)
  10. Java静态方法为什么不能访问非静态方法
  11. SQL Server进阶(五)子查询
  12. 黑盒测试实践——day01
  13. EasyUI的onLoadSuccess方法
  14. intellij idea svn 修改文件后,父文件夹也标注修改
  15. [No000010B]Git4/9-时光机穿梭
  16. ICAO 附件十四面课件分享
  17. (三) DRF 序列化
  18. Zabbix监控windows的CPU利用率和其他资源
  19. 2018.09.24 bzoj4977: [[Lydsy1708月赛]跳伞求生(贪心+线段树)
  20. 按条件设置gridcontrol 单元格属性

热门文章

  1. java\c程序的内存分配
  2. 【Qt】学习笔记(一)
  3. [Android Studio] 使用本地 aar 文件
  4. Fresco 源码分析(一) DraweeView-DraweeHierarchy-DraweeController(MVC) DraweeView的分析
  5. 《Java程序性能优化》学习笔记 程序优化
  6. Android中获取蓝牙log
  7. 在windows下用toolbox玩会docker
  8. Striiv Myland 攻略
  9. Activity启动方式
  10. MySQL命令执行sql文件的两种方法