判断一棵二叉树是否为完全二叉树

387 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

判断一棵二叉树是否为完全二叉树

问题描述

给定一棵二叉树,请判断该二叉树是否为完全二叉树。

输出描述:输出是否为完全二叉树。

注意:空子树我们认为是符合完全二叉树。

示例:

输入:{2,1,3}

输出:true

分析问题

在引出完全二叉树的定义之前,我们先来看一下什么是满二叉树。满二叉树是指除了最后一层叶子节点外,每一层上的所有结点都有两个子结点二叉树。而完全二叉树是由满二叉树引出来的。对于深度为K的,有n个节点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时,我们称之为完全二叉树。如下图所示。

image-20211022135635926.png

根据完全二叉树的定义,我们可以通过广度优先搜索进行求解,每遇到一个节点时,我们进行判断。

  1. 如果节点的左孩子为空且右孩子不为空的时,该树不是完全二叉树。
  2. 如果第一次发现左、右两个孩子不是双全的时候,我们记录一下。如果后面访问到的节点出现非叶子节点时,那么表明该树不是完全二叉树。

image-20211022170407957.png

    def isAllTreeBST(self, root):
        #如果是空树,直接返回True,因为空树也是完全二叉树
        if not root:
            return True
            
        queue=collections.deque([root])
        #遇到第一个非双全的节点,打个标记
        flag=False
        while queue:
            node = queue.popleft()
            left = node.left
            right = node.right
            #如果flag为true 且 访问到的节点出现非叶子节点时,表明是非完全树,返回False
            if flag and not (left==None and right==None):
                return False
            #左孩子为空且右孩子不为空的时,表明是非完全树,返回False
            if left==None and right != None:
                return False

            if left!=None:
                queue.append(left)

            if right!=None:
                queue.append(right)
            #遇到非全节点,设置flag=True
            if left==None or right==None:
                flag = True
                
        return True