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;
}
版权声明:本文为weixin_46678290原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46678290/article/details/105638810

智能推荐

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...