958. 二叉树的完全性检验
作者:互联网
#这个代码无法通过,我觉得我写复杂了,所以这个代码不要再修修补补了
#直接换个思路
def fun1(root):
'''
验证是否为完全二叉树
完全二叉树的定义:
除最后一层外,每一层一定都是满的
最后一层若不满,则为是从左往右依次排列
那么第一想法很简单,不能是深度优先遍历,应该是宽度优先遍历
每一层每一层的遍历,那么不满足什么规则就不是完全二叉树了
1.一个节点只有右子节点,没有左子节点
2.在不违背1的前提下,如果遇到了第一个左右子不全的情况(只有左子节点)后序的均为叶节点
:return:
'''
if not root:
return True
duilie = [root]
panduan=True
while duilie: # 队列不为空进来
root = duilie.pop(0) # 删除队首元素
if root.right: #
if not panduan:#说明经历过有左无右,不能再有右节点了
return False
duilie.append(root.right)
if root.left:
duilie.append(root.left)
else:
return False
else:
if panduan:#判断是否为第一次有左无右
if root.left:
panduan = False
duilie.append(root.left)
else:
if root.left:
return False
return True
def fun2(root):
'''
找出所有可以证明他不是完全二叉树的判断
1.一个节点只有右子节点,没有左子节点
2.在不违背1的前提下,如果遇到了第一个左右子不全的情况后序的为叶节点
:param root:
:return:
'''
duilie = [root]
panduan=False #用来确定某一事件是否发生,在这里是有左无有是否发生了
while duilie: # 队列不为空进来
root = duilie.pop(0) # 删除队首元素
l=root.left
r=root.right
if (l==None and r!=None) \
or (panduan and (l!=None or r!=None)): #剩下三种情况,有左无右,都无,都有.如果没有经历过不双全节点,那么都行.
#如果经历过不双全那么只能是都无,不是都无则为False
return False
if l:
duilie.append(root.left)
if r:
duilie.append(root.right)
if (l==None or r==None): #有左无有,或者一个都没有的时候(有右无左已经被判断了)后面都必须是叶节点
panduan=True
return True
标签:完全性,958,return,panduan,duilie,二叉树,False,root,节点 来源: https://blog.csdn.net/qq_53183608/article/details/122491013