2021-02-01 | 958. 二叉树的完全性检验

1. 题目描述

给定一个二叉树,确定它是否是一个_完全二叉树_。

百度百科中对完全二叉树的定义如下:

若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2 个节点。)

示例 1:
在这里插入图片描述

输入:[1,2,3,4,5,6]
输出:true
解释:最后一层前的每一层都是满的(即,结点值为 {1}{2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。

示例 2:
在这里插入图片描述

输入:[1,2,3,4,5,null,7]
输出:false
解释:值为 7 的结点没有尽可能靠向左侧。

提示:

  1. 树中将会有 1 到 100 个结点。

2. 解题思路

对于这道题目,我们可以使用层序遍历来解决。在层序遍历的过程中,需要用一个index来维护节点的索引,如果一个节点的index,那它的左孩子的索引是index * 2,右孩子的索引是index * 2 + 1

这里我们初始化一个队列,用来存储当前节点node和当前节点的索引值index。使用一个count来记录当前已经遍历到第几个节点。如果当前节点的索引值index和count + 1相等,那么说明当前节点的位置时正确的,就继续遍历,如果不相等,说明中间缺少了节点,直接返回false,结束遍历。

复杂度分析:

  • 时间复杂度:O(n),这里最坏的情况就是我们需要遍历整棵二叉树,所以时间复杂度为O(n),其中n是二叉树的节点的数量;
  • 空间复杂度:O(1),我们需要初始化一个队列来保存当前遍历的节点,这个队列是一个常数空间,所以空间复杂度为O(1)。

3. 代码实现

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isCompleteTree = function(root) {
    if(!root){
        return true
    }
    let count = 0
    const queue = [{ node: root, index: 1 }]

    while(queue.length){
        const temp = queue.shift()
        
        const node = temp.node 
        const index = temp.index
        // 判断当前节点是否是正确的顺序值
        if(index !== ++count){
            return false
        }
        // 遍历当前节点的左右子树
        node.left && queue.push({node: node.left, index: index * 2})
        node.right && queue.push({node: node.right, index: index * 2 + 1})
    }
    return true
};

4. 提交结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CUG-GZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值