二叉树的完全性检验
给定一个二叉树的 root ,确定它是否是一个 完全二叉树 。
在一个 完全二叉树 中,除了最后一个关卡外,所有关卡都是完全被填满的,并且最后一个关卡中的所有节点都是尽可能靠左的。它可以包含 1 到 2h 节点之间的最后一级 h 。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:true
解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。
示例 2:
输入:root = [1,2,3,4,5,null,7]
输出:false
解释:值为 7 的结点没有尽可能靠向左侧。
思路:
这道题我们依然可以用层序遍历的思路判断完全二叉树。只不过以前的层序遍历我们是只放节点,不需要考虑None;而这里我们为了判断完全性,需要把None也放进层序遍历的结果。(这里放None的意思就是,假如一个节点没有左子节点(左子节点为None),正常层序遍历我们就不再处理;而现在我们需要将左子节点指向的None也添加进下一层)
得到层序遍历结果后,我们检查倒数二层及以上的层中是否有None值,但凡有一个None值,那么这个二叉树就不是完全二叉树,返回False;
最后再在最后一层进行判断,根据题意,最后一层可以允许None值全排在最后,因此我们只要检查一下是否有None被节点值“夹在中间”的情况,如果有则也不是完全二叉树,返回False。
最终如果二叉树的层序遍历结果通过了重重检查,我们就认为它是一个完全二叉树,返回True。
代码:
class Solution(object):
def isCompleteTree(self, root):
q = [root]#层序遍历 一开始把root放进去
res=[]
while q:#开始层序遍历
rr = []
for i in range(len(q)):#q的长度为几
node = q.pop(0)#就弹出几次
if node:
rr.append(node.val)
q.append(node.left)#不判断左右是否存在,直接放,None也要
q.append(node.right)
else:
rr.append(None)
res.append(rr)
#现在拿到层序遍历结果res了
#因为res的最后一层全是None,res的倒数第二层才是二叉树的倒数第一层
res = res[:-1]#把res全是None的最后一层去掉
#判断二叉树中除了倒数第一层外的所有层
for i in range(len(res)-1):
if None in res[i]:#如果最后有None,也不是完全二叉树
return False
#判断二叉树的最后一层
rr = res[-1]#二叉树的最后一层
flag=0
for r in rr:#遍历这一层的所有元素
if r ==None:#如果出现了None
flag=1#立一个标记
if r !=None and flag==1:#如果None后面又出现了数值
return False#肯定不是完全二叉树 直接返回False
return True #能到这里,说明通过了重重检查,是完全二叉树了
小结:
还是说,层序遍历的基本框架是非常好用的,很多地方都可以利用上。这一题要特别注意的是,这种层序遍历的方式因为会将None也添加,因此它的遍历结果最后一层必然全是None(相当于是原二叉树最后一层节点的子节点),遍历结果的倒数第二层才是二叉树的倒数第一层,,所以别忘了处理一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了