二叉树的完全性检验

958. 二叉树的完全性检验

给定一个二叉树的 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(相当于是原二叉树最后一层节点的子节点),遍历结果的倒数第二层才是二叉树的倒数第一层,,所以别忘了处理一下。

posted @   JunanP  阅读(22)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示