题目:
有一棵二叉树,请设计一个算法判断它是否是完全二叉树。
给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。
测试用例:
输入:{1,2,3,4}
输出:True
输入:{1,2,3,null,4}
输出:False
思路:
完全二叉树,其空缺的结点必然集中在右侧。因此如果一个结点有左孩子却没有右结孩子,则必然不是完全二叉树;如果完全二叉树中一个结点没有右孩子,那么它右侧的结点一定全是叶子结点(没有左右孩子) ,否则也不是完全二叉树。可以用层次遍历的方法,当出队的结点右孩子为空时,在之后出队的结点一定叶子节点。
代码:
class CheckCompletion:
def chk(self, root):
# write code here
q = [root]
isleaf = False
while q:
cur = q.pop(0)
if isleaf and (cur.left or cur.right):
return False
if not cur.left and cur.right:
return False
if cur.left:
q.append(cur.left)
if cur.right:
q.append(cur.right)
else:
isleaf = True
return True