数据结构之判断一棵树是不是完全二叉树

1 完全二叉树

完全二叉树是由 满二叉树 而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

如下就是完全二叉树

                12                    3
4           5        6           7

如下就是完全二叉树

                12                    3
4           5       

如下不是完全二叉树

                12                    3
4           5                    7

 

 

2 分析

判断一颗二叉树是不是完全二叉树,我们用层遍历数(这里需要用到队列)

1)如果根节点为NULL, 返回false,不是的话,我们queue把根节点push到里面去,然后在放到queue大小不为空的循环里面,进行queue.front()操作得到节点。

2)如果节点的左叶子是空,右叶子节点不是空,直接返回false。

3)如果节点的左叶子不是空,右叶子节点不是空,我们分别把左右叶子节点压去queue,同时pop出最前面的元素。

4)如果遇到一个结点,左叶子不为空,右叶子为空;或者左右叶子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树

 

 

 

3 代码实现

#include <iostream>
#include <queue>using namespace std;typedef struct Tree 
{int value;struct Tree* left;struct Tree* right;Tree(int value):value(value), left(NULL), right(NULL){}
} Tree;bool isCompleteTree(Tree* node)
{if (node == NULL)return false;queue<Tree *> queue;queue.push(node);while (!queue.empty()){Tree *pNode = queue.front();//左叶子是空,右叶子节点不是空if (pNode->left == NULL && pNode->right != NULL)return false;//左叶子不是是空,右叶子节点不是空if (pNode->left != NULL && pNode->right != NULL){queue.pop();queue.push(pNode->left);queue.push(pNode->right);}//左叶子不为空,右叶子为空;或者左右叶子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树if ((pNode->left == NULL && pNode->right == NULL) || (pNode->left != NULL && pNode->right == NULL)){if (pNode->left != NULL && pNode->right == NULL){queue.push(pNode->left);}queue.pop();while (!queue.empty()){Tree* node = queue.front();if (node->left == NULL && node->right == NULL){queue.pop();}else{std::cout << "false...." << std::endl;return false;}        }return true;}}return true;
}int main()
{Tree node1(1);Tree node2(2);Tree node3(3);Tree node4(4);Tree node5(5);Tree node6(6);Tree node7(7);node1.left = &node2;node1.right = &node3;node2.left = &node4;node2.right = &node5;node3.left = &node6;node3.right = &node7;std::string res = "";res = (isCompleteTree(&node1) == 1) ? "true" : "false";std::cout << "Tree isFullTree is " << res << std::endl;return 0;
}

 

 

 

 

 

 

 

4 运行结果

Tree isFullTree is true

 

 

 

 

 

5 总结

完全二叉树如果遇到一个结点,左叶子不为空,右叶子为空;或者左右叶子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树

完全二叉树还有这个性质,比如这个树有n个节点,那么这个树的有左右孩子节点的父节点有n / 2个,如果我们堆顶是从下标0开始的,那么n / 2个数就对于于下标0~ (n / 2 - 1),而且如果当前节点是下标i的话(有左右子节点情况),那么它的左孩子节点的下标是2*i + 1,右孩子节点下标是2 * i + 2, 如果我们堆顶是从下标1开始的,那么n / 2个数就对于于下标0~ (n / 2),而且如果当前节点是下标i的话(有左右子节点情况),那么它的左孩子节点的下标是2*i ,右孩子节点下标是2 * i + 1, 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu添加中文输入法

Ubuntu上的输入法主要有小小输入平台&#xff08;支持拼音/二笔/五笔等&#xff09;&#xff0c;Fcitx&#xff0c;Ibus&#xff0c;Scim等。其中Scim和Ibus是输入法框架。在Ubuntu的中文系统中自带了中文输入法&#xff0c;通过CtrlSpace可切换中英文输入法。这里我们主要说下…

打开vs2010,提示无效的许可证数据,需要重新安装

解决办法&#xff1a; 1. 找到安装路径下Microsoft Visual Studio 10.0\Common7\IDE\DDConfigCA.exe ,使用管理员权限运行该exe文件&#xff0c;等待自然退出&#xff1b; 2. 重启VS&#xff0c;重新输入产品密钥&#xff0c;VS2010专业版&#xff08;or旗舰版&#xff09;密…

python3 爬虫第三步 本文包你学会正则 不会就来锤我

简介 正则表达式是一种描述字符的一种方式&#xff0c;通过该方式&#xff0c;匹配字符串。 正则表达式是自由的&#xff0c;一个字符的含义往往代表着一类字符&#xff0c;通过多个正则正则符号的组合描述&#xff0c;可以使组成的正则表达式能够描述一类字符串。 在开发中&a…

.NET性能优化-使用结构体替代类

前言我们知道在C#和Java明显的一个区别就是C#可以自定义值类型&#xff0c;也就是今天的主角struct&#xff0c;我们有了更加方便的class为什么微软还加入了struct呢&#xff1f;这其实就是今天要谈到的一个优化性能的Tips使用结构体替代类。那么使用结构体替代类有什么好处呢&…

ISE14.7兼容性问题集锦

一、 关于win8和win10不兼容性解决办法 &#xff08;win7不会出现闪退的问题&#xff0c;按安装流程做完就可以直接使用了&#xff09; 在安装目录下&#xff0c;我这里是D:\ISE_14.7\14.7\ISE_DS\ISE\lib\nt64中找到libPortability.dll和libPortabilityNOSH.dll两个文件夹&…

幼儿园调查过程怎么写_深圳全托幼儿园哪个好 幼儿园寄宿怎么报名

陪孩子一起阅读的精髓不是认字和背诵&#xff0c;亲子阅读的那些事 亲子阅读是当代的养育新潮流&#xff0c;但它还有更可贵的一面。 脾气再大的妈妈&#xff0c;都有温柔可爱的时刻&#xff0c;就是陪伴孩子阅读的时刻&#xff0c;曾经有一位在我看来算不上温柔的妈妈&#xf…

调优 PHP

调优 PHP PHP 是运行应用程序代码的引擎。应该仅安装计划使用的那些模块&#xff0c;并配置您的 Web 服务器&#xff0c;使之仅为脚本文件&#xff08;通常是以 .php 结尾的那些文件&#xff09;使用 PHP&#xff0c;而非所有静态文件。操作码缓存 请求一个 PHP 脚本时&#x…

ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 目录 一、地理配准工具条简介 二、地理配准过程 1、加载数据&#xff08;点击下载&#xff09;提取码&#xff1a;v9y8 2、加载地理配准工具条 3、添加控制点 …

cocos2d-x知识总结

1. CCMoveTo动作运行多次&#xff0c;位置会发生诡异的变化&#xff0c;比如变成目标位置的几倍。解决办法&#xff0c;确保每次CCMoveTo之前停止之前的动作。 2. 在onEnter()函数中&#xff0c;忘记调用父类的onEnter()函数会导致动画等无效。还有在init()函数中&#xff0c;谨…

数据结构之判断一棵树是不是完满二叉树

1 完满二叉树 除了叶子结点之外的每一个结点都有两个孩子结点。 如下是完满二叉树 12 34 56 7 2 分析 我们按层(queue)遍历数,如果发现左子树为空右子树不为空 或者 左子树不为空右子树为空 的情况下直接返回…

php基础教程 第二步 通俗易懂的学习变量、常量与数据类型

简介 变量、常量以及数据类型 在编程中&#xff0c;变量指一个存储值的一个盒子&#xff0c;或者说容器。例如一个箱子&#xff0c;用来放杂物&#xff0c;这个箱子就是一个容器&#xff0c;值就为杂物。容器可以分为很多类型&#xff0c;例如瓶子、被子、盒子等。值也有很多类…

ArcGIS实验教程——实验三:矢量数据采集与编辑(矢量化)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 扫描矢量化是常见的GIS数据采集方法之一,在实际工作中很常见。有些人觉得数字化就是听着歌点鼠标,其实不然。数字化是GISer的基本功。掌握数字化的基本方法,熟练的进行数字化在实际工作中显得尤为…

可见光能量范围_JACS:游书力团队通过可见光促进的吲哚衍生物分子内去芳构化合成环丁烷稠合的四环吲哚螺环...

点击上方了解化学加VIP会员企业导读近日&#xff0c;中国科学院上海有机所游书力团队开发了一种可见光促进的吲哚衍生物分子内[22]环加成方法&#xff0c;可以极好的收率和立体选择性得到环丁烷稠合的四环吲哚螺环(Scheme 1&#xff0c;底部)。该成果近期发表在J. Am. Chem. So…

章鱼黑的第一篇博客~

Part One&#xff1a;结缘计算机 推荐博客&#xff1a;https://book.douban.com/subject/4006425/discussion/22803961/ 从踏入大学的第一天&#xff0c;我就对这一专业充满了好奇与兴趣。我之所以会选择计算机这个专业&#xff0c;是因为从小对电脑的喜爱&#xff0c;再加上现…

记将一个大型客户端应用项目迁移到 dotnet 6 的经验和决策

在经过了两年的准备&#xff0c;以及迁移了几个应用项目积累了让我有信心的经验之后&#xff0c;我最近在开始将团队里面最大的一个项目&#xff0c;从 .NET Framework 4.5 迁移到 .NET 6 上。这是一个从 2016 时开始开发&#xff0c;最多有 50 多位开发者参与&#xff0c;代码…

1Android系统移植与驱动开发概述

1、Android系统架构分为四层&#xff0c;从下至上依次为Linux内核层&#xff0c;C/C代码库、Android SDK API、应用程序&#xff0c;要熟悉每一层的内容以及功能&#xff1b; 2、Android移植分为应用移植和系统移植&#xff0c;系统移植的主要工作是移植Linux驱动和移植HAL&…

数据结构之堆排序

1 堆排序 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点,我们可以理解构建的堆是 完全二叉树 ,它们的下标有如下性质 完全二叉树还有这…

ArcGIS实验教程——实验一:ArcGIS软件的认识与使用

ArcGIS实验视频教程合集&#xff1a;《ArcGIS实验教程从入门到精通》&#xff08;附配套实验数据&#xff09; 实验目录 第一节 Esri简介 1.1 ESRI简介 1.2 Esri产品发展历程 第二节 ArcGIS简介 2.1 ArcGIS简介 2.2 ArcGIS产品体系 第三节 Desktop简介 3.1 Desktop简介…

10分钟学会vue滚动行为

滚动行为 什么是路由的滚动行为 当切换到新路由时&#xff0c;想要页面滚到顶部&#xff0c;或者是保持原先的滚动位置&#xff0c;就像重新加载页面那样 注意: 这个功能只在 HTML5 history 模式下可用。在这个模式下我们需要启动一个服务 我们用scrollBehavior 方法来做路由滚…

php基础教程 第三步 学习字符串及相关函数

字符串 上一节中我们学习了 php 变量、常量以及数据类型的一些概念。这一节中进一步学习数据类型中的字符串类型及其相关操作方法。 字符串指一串字符的合集。例如单个字符 a&#xff0c;单个字符 b&#xff0c;单个字符 c…这些 a、b、c 皆是字符&#xff1b;当把这些字符连…