判断一棵二叉树是否为完全二叉树的算法_完全二叉树怎么判别

判断一棵二叉树是否为完全二叉树的算法_完全二叉树怎么判别小知识,大挑战!本文正在参与“程序员必备小知识”创作活动 判断一棵二叉树是否为完全二叉树 问题描述 给定一棵二叉树,请判断该二叉树是否为完全二叉树。 输出描述:输出是否为完全二叉树。 注意:空子树我们

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

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

问题描述

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

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

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

示例:

输入:{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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13581.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注