可视化图解算法:判断是否完全二叉树
1. 题目
描述
给定一个二叉树,确定他是否是一个完全二叉树。
完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)
数据范围:节点数满足 1≤n≤100
样例图1:
样例图2:
样例图3:
示例1
输入:
{1,2,3,4,5,6}
返回值:
true
示例2
输入:
{1,2,3,4,5,6,7}
返回值:
true
示例3
输入:
{1,2,3,4,5,#,6}
返回值:
false
2. 解题思路
先来看完全二叉树的定义:
完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。(第 h 层可能包含 [1~2h] 个节点)
通过层序遍历二叉树:先将节点入队列,之后取出节点,将节点对应的左右子树入队列,如此循环往复。(注意:左右子树为null也要入队列;null节点没有左右子树,因此不能对null节点的左右子树入队列。)判断方法:如果当前节点不为空,前面的(同一层或上几层)节点出现了空,因此则该二叉树不是完全二叉树。
对于二叉树的层序遍历,请参考前期文章《可视化图解算法:二叉树的层序遍历》。
对于如下的二叉树,进行层序遍历之后,结果集数据中对应的数据前面没有null,因此该二叉树是完全二叉树。
对于如下的二叉树,进行层序遍历之后,结果集中的6前面出现了null,因此该二叉树是不是完全二叉树。
如果文字描述的不太清楚,你可以参考视频的详细讲解。
-
Python版本:https://www.bilibili.com/cheese/play/ep1372112
https://www.bilibili.com/cheese/play/ep1372112
-
Java版本:https://www.bilibili.com/cheese/play/ep1367351
https://www.bilibili.com/cheese/play/ep1367351
-
Golang版本:https://www.bilibili.com/cheese/play/ep1364776
https://www.bilibili.com/cheese/play/ep1364776
3. 编码实现
核心代码如下:
/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @return bool布尔型*/
func isCompleteTree(root *TreeNode) bool { // write code here//如果节点为空,则为完全二叉树if root == nil {return true}//定义一个队列,将根节点入队列queue := []*TreeNode{root}nullNodeExist := false //同一层级左边的节点是否为空,或者上一层级是否有空节点for len(queue) > 0 {count := len(queue) //获取一层中的节点数量,并进行遍历for i := 0; i < count; i++ {curNode := queue[0] //获取队列的顶部元素queue = queue[1:] //删除队列的顶部元素if curNode == nil {nullNodeExist = true} else {if nullNodeExist {return false //当前节点不是空节点;而同一层级左边的节点为空,或者上一层级有空节点 则 不是完全二叉树}//将左右子树都入队列(空值也入队列)queue = append(queue, curNode.Left)queue = append(queue, curNode.Right)}}}// 所有层都遍历完了,说明是完全二叉树return true
}
具体完整代码你可以参考下面视频的详细讲解。
-
Python版本:https://www.bilibili.com/cheese/play/ep1372112
https://www.bilibili.com/cheese/play/ep1372112
-
Java版本:https://www.bilibili.com/cheese/play/ep1367351
https://www.bilibili.com/cheese/play/ep1367351
-
Golang版本:https://www.bilibili.com/cheese/play/ep1364776
https://www.bilibili.com/cheese/play/ep1364776
4.小结
对于完全二叉树的判断,可以先将二叉树进行层序遍历,对遍历的结果进行判断,判断方法:如果当前节点不为空,前面的(同一层或上几层)节点出现了空,因此则该二叉树不是完全二叉树。
《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:
✅ 链表
✅ 二叉树
✅ 二分查找、排序
✅ 堆、栈、队列
✅ 回溯算法
✅ 哈希算法
✅ 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!
-
Python编码实现:https://www.bilibili.com/cheese/play/ss897667807
https://www.bilibili.com/cheese/play/ss897667807
-
Java编码实现:https://www.bilibili.com/cheese/play/ss161443488
https://www.bilibili.com/cheese/play/ss161443488
-
Golang编码实现:https://www.bilibili.com/cheese/play/ss63997
https://www.bilibili.com/cheese/play/ss63997
对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:不积跬步,无以至千里;不积小流,无以成江海。