7-2 是否完全二叉搜索树 (30分)
标签: 笔记

分析:
本题关键是完全二叉搜索树的概念(或者说定义)
我第一次没弄清楚什么是完全二叉树的概念,以为只有一种情况左孩子为空,右孩子不空这样就不是完全二叉树了,并把它当成判断条件来写代码,结果导致测试点3,4,5没过
我一开始疑惑为什么一边完美,另一边完全,会是NO,两边明明都是完全啊,合起来为完全嘛?(n脸懵逼)
原来是这样:


左图左子树为完美二叉树,右图为完全二叉树,但整棵树不是完全二叉树,因为8号结点,按完美二叉树(右图)的次序应该也是12号,但它是8号,相对位置不一样,所以他不是完全二叉树。
所以判断完全二叉树的思路
首先每个二叉树都会有以下4种情况:
情况一:

情况二:

情况三:

情况四:

1:如果当前访问的节点的左右孩子是情况3,说明不是完全二叉树,直接返回false。
2:如果当前访问的节点的左右孩子是情况1,继续访问其他节点。
3:如果当前访问的节点的左右孩子是情况2或者情况4,那么就做一个判断(接下来访问的所有节点必须全部是叶子节点)。
具体代码看下面程序中的Pan(BinTree BST)函数。
#include<stdio.h>
#include<stdlib.h>
typedef struct TNode* BinTree;
struct TNode{
int Data;
BinTree Left;
BinTree Right;
};
BinTree Insert( BinTree BST, int x )
{
if(!BST){
BST=(BinTree)malloc(sizeof(struct TNode));
BST->Data=x;
BST->Left=BST->Right=NULL;
}
else{
if(x>BST->Data) BST->Left=Insert( BST->Left, x );
else if(x<BST->Data) BST->Right=Insert( BST->Right, x );
}
return BST;
}
void Out(BinTree BST)
{
int i,front=0,tail=0,p=0;
BinTree a[30],x;
a[++tail]=BST;
while(tail!=front){
x=a[++front];
if(p==0) {
printf("%d",x->Data);
p=1;
}
else printf(" %d",x->Data);
if(x->Left) a[++tail]=x->Left;
if(x->Right) a[++tail]=x->Right;
}
}
void Pan(BinTree BST)
{
int i,front=0,tail=0,q=0;
BinTree a[30],x;
a[++tail]=BST;
while(tail!=front){
x=a[++front];
if(!x->Left&&x->Right){
printf("\nNO");
return;
}
if(x->Left&&x->Right){
a[++tail]=x->Left;
a[++tail]=x->Right;
}
if(!x->Right&&x->Left){
a[++tail]=x->Left;
q=1;
}
if(!x->Right&&!x->Left) q=1;
while(q==1&&tail!=front){
x=a[++front];
if(x->Left||x->Right){
printf("\nNO");
return;
}
}
}
printf("\nYES");
}
int main()
{
int n,i,x;
BinTree BST=NULL;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&x);
BST=Insert(BST, x);
}
Out(BST);
Pan(BST);
return 0;
}
智能推荐
centos7开启开机自动联网
将onboot选项的no改为yes 这个文件也可以将pc从dhcp修改为静态 ip配置 需要修改BOOTPROTO=dhcp为static,然后文件最后添加IP,GATEWAY,MASK,DNS...
R 基础知识:数据结构(data.frame & matrix & array)
1.data.frame data.frame是R语言用来处理表格式数据的数据结构。我们可以运用data.frame()函数手动创造数据框,让我们建立一个很简单的数据框叫做greatnbateams,这个数据框有队名、胜场数、败场数、是否获得总冠军与球季。 我们使用观测值(observations)来称呼数据框中水平方向的数据,使用变数(variables)来称呼数据框中垂直方向的数据;数据框能够...
mysql高级-视图
视图定义:是由查询结果形成的一张虚拟表,是表通过某种运算得到的一个投影。 同一张表可以创建多个视图。 创建视图的语法: create view viewName as select语句 查询视图:和表一样,可以添加where条件。 修改视图:alter view viewName as select * from… 删除视图:drop view viewName. 查看视图结构:和表...
【cocos creater】9.仿《弓箭传说》- 子弹的碰撞
查看项目所有章节 接着上一章,编辑bullet.ts脚本文件,添加碰撞函数,此方法在元素发生碰撞时会调用 同时,编辑bullet精灵属性,添加碰撞组件 碰撞组件有三个,一个是矩形,一个是圆形,一个是自定义。这里我们任选一个都可以 分别给bullet,role,enemy三个元素都添加上碰撞组件 再打开enemy属性,选择group,点击编辑按钮,打开分组管理 分别添加role组,enemy组,bu...
HTML P不能包含块级元素(包括自身)(转)
abcc项目中碰到的,在一个表单中用P包含一个label和div,从Firebug中看html结构div却跑到P外面去了。甚是诧异,原来P元素是不能包含块级元素(包括P自身)的。 The P element represents a paragraph. It cannot contain block-level elements (including&nb...
猜你喜欢
centos mysql5.7 安装及初始化配置
1、配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ 2、安装MySQL 3、启动MySQL服务 4、配置MySQL 5、部分贴图...
【经验总结】电脑休眠后虚拟网卡地址变成169.254网段的解决方法
0x00 前言 一直以来会遇到一个问题,就是电脑在休眠后再次打开电脑,在使用虚拟机时网络老是会碰到问题,此时如果查看物理机上虚拟网卡的地址就会发现 IP 地址变成了 169.254.xxx.xxx 。 之所以会出现这个问题是因为 Windows 在网络不通的情况下,会自动配置一个169.254.xxx.xxx这个地址段的IP地址。 0x01 常规解决方法 在控制面板 -> 网络和 Inter...
汇总我在IDEA中使用Maven导包遇到的问题
看吐了吗?我是真吐了 真正遇到这些问题的朋友看到这,是不是有种找到知音的感觉,别怕,你不是在一个人战斗,苦逼的日子里,还有个我陪你一起苦逼,吐了吐了,这问题不知道耗费了我多久的时间,百度好多也解决不了,找身边的大佬帮忙也解决不了,我...
Easyui 1.8.6 日期控件(datebox或datetimebox)单击显示日期选择(日历)
修改jquery.easyui.min.js文件 通过Ctrl + f 输入 tb._size(opts 进行定位 在其下方添加如下代码: 注意: _588、_58d、_58f 这三个需要根据自己的进行修改。 版本不同可能有很大的区别!!!...
Android 扫描相册中的二维码
关于生成扫描二维码的操作可使用GitHub的开源库ZXing:https://github.com/zxing/zxing 我在项目中使用了Zxing的精简库https://github.com/azhong1011/libzxing 将libzxing作为module导入项目 一、生成二维码(可添加logo) 二、生成的二维码长按保存相册 三、扫描二维码 四、扫描在相册中的二维码 1、在libz...
