BM35. [判断是不是完全二叉树]

alt

https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=295

BM35. 判断是不是完全二叉树

https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae?tpId=295&sfm=github&channel=nowcoder

题目分析

首先我们需要知道什么是完全二叉树,叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。需要注意的是,满二叉树肯定是完全二叉树,而完全二叉树不一定是满二叉树。

这里面最重要的一句话就是叶子结点只能出现在最下层和次下层,所以我们想到可以使用层序遍历,只有次下层和最下层才有叶子节点。想一下我们对称的二叉树层序回文求解过程,将每层的空节点也填充了进去。

具体做法
所以层序遍历过程次下层会出现一个空节点,然后接续向后遍历,且在遍历结束之前也就是queue不为空之前不会再出现空节点,如果出现就不是完全二叉树

alt

代码如下

while(!queue.isEmpty()){
  TreeNode cur = queue.pop();
  cur在这个里面仅仅只能有一次为空,否则就不是完全二叉树
}

转化为代码直接使用层序遍历模板

public boolean isCompleteTree (TreeNode root) {
  //如果是空节点就是true
        if(root==null){
        return true;
    }
    Queue<TreeNode> queue=new LinkedList<>();
    queue.offer(root);
    TreeNode cur;
    //定义一个首次出现的标记位
    boolean notComplete=false;
    while (!queue.isEmpty()){
        cur=queue.poll()();
        if(cur==null){
            notComplete=true;
            //第一个空节点之后的节点,countinue使用的很妙
            continue;
        }
        if(notComplete){
            return false;
        }
        queue.offer(cur.left);
        queue.offer(cur.right);
    }
    return true;
}

复杂度分析:

  • 时间复杂度:O(n),无论中序遍历、层次遍历还是检查排序都是O(n)
  • 空间复杂度:O(n),中序递归最大栈空间和层次队列的最大空间都为O(n)

alt

#面经##题解##面试题目#
全部评论

相关推荐

不愿透露姓名的神秘牛友
02-12 18:14
RT,这周五就是情人节了,前女友给我发了消息,我该不该回?
Yoswell:原则上来说让她滚,但是本着工作很累下班想吃瓜的心态,我觉得你可以回一下
点赞 评论 收藏
分享
01-02 21:17
已编辑
西安理工大学 后端
程序员小白条:项目不太重要,你的优势的算法竞赛,然后多背相关的八股文,项目可以不作为重点考虑,面试可能就简单带过项目就行了,你可以直接写简历,背项目相关的八股文就行,也不用自己做,时间紧张的情况下,性价比最高
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务