DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • Array

    • 数组
    • 二分查找
    • moveZeros
  • Dynamic-programming

    • 动态规划
  • 刷题指南
  • String

    • 字符串
  • bitwise-operator

    • 位运算符
  • heap
  • history

    • [1014] 最佳观光组合
    • [1022] 从根到叶的二进制数之和
    • [104] 二叉树的最大深度
    • [11] 盛最多水的容器
    • [110] 平衡二叉树
    • [1227] 飞机座位分配概率
    • [129] 求根节点到叶节点数字之和
    • [1306] 跳跃游戏 III
    • [148] 排序链表
    • 155.最小栈
    • [165] 比较版本号
    • 1763. 最长的美好子字符串
    • [1870] 准时到达的列车最小时速
    • [199] 二叉树的右视图
    • [21] 合并两个有序链表
    • 215.数组中的第 k 个最大元素
    • [2306] 公司命名
    • [234] 回文链表
    • [2516] 每种字符至少取 K 个
    • [316] 去除重复字母
    • [3171] 找到按位或最接近 K 的子数组
    • [322] 零钱兑换
    • [41] 缺失的第一个正数
    • [44] 通配符匹配
    • [494] 目标和
    • [509] 斐波那契数
    • [518] 零钱兑换 II
    • [62] 不同路径
    • [676] 实现一个魔法字典
    • 70 爬楼梯
    • [718] 最长重复子数组
    • [78] 子集
    • [82] 删除排序链表中的重复元素 II
    • [871] 最低加油次数
    • [88] 合并两个有序数组
    • [887] 鸡蛋掉落
    • 958.二叉树的完全性检验
    • [98] 验证二叉搜索树
    • [983] 最低票价
    • leetcode practice
    • 约瑟夫问题
    • 移除重复节点
  • linked-list

    • 706. 设计哈希映射
    • 链表
  • stack

    • stack
  • tree

    • Tree Traversal
    • 二叉树的最近公共祖先
    • 二叉树
    • 题目
  • leetCode 刷题
  • 回溯
  • 排序算法

958.二叉树的完全性检验

dfs

二叉树的完全性检验问题要求我们检查一棵二叉树是否是完全二叉树。完全二叉树的定义是:在完全二叉树中,所有层除了最后一层必须是完全填满的,最后一层的所有节点必须尽可能靠左。

可以通过广度优先搜索 (BFS) 来解决这个问题。我们使用一个队列来遍历树的节点,并记录我们是否遇到了一个空节点。如果在遇到空节点之后仍然遇到非空节点,则说明这不是一个完全二叉树。

var isCompleteTree = function (root) {
    if (!root) return true;
    let queue = [root];
    let hasNull = false;
    while (queue.length) {
        const node = queue.shift();

        if (node === null) {
            hasNull = true;
        } else {
            if (hasNull) return false;
            queue.push(node.left);
            queue.push(node.right);
        }
    }
    return true;
};

解释

  1. 队列初始化:首先,我们初始化一个队列,将根节点入队。
  2. 广度优先搜索:我们使用一个 while 循环来遍历队列中的所有节点。
    • 空节点检查:如果当前节点是 null,我们设置 foundNull 标志为 true,表示我们已经遇到过一个空节点。
    • 非空节点检查:如果当前节点不是 null,但之前已经遇到过空节点(即 foundNull 为 true),说明这不是一个完全二叉树,返回 false。
    • 继续遍历:将当前节点的左子节点和右子节点依次入队。
  3. 遍历结束:如果队列遍历结束后没有违反完全二叉树的条件,则返回 true。

复杂度分析

  • 时间复杂度:O(N),其中 N 是二叉树的节点数。我们需要遍历每个节点一次。
  • 空间复杂度:O(N),最坏情况下队列中可能包含所有节点。
bfs

对比最后节点索引 === 节点数量-1

var isCompleteTree = function (root) {
    if (!root) return true;

    let maxIndex = 0;
    let nodeCount = 0;

    const dfs = (node, index) => {
        if (!node) return;
        nodeCount++;
        maxIndex = Math.max(maxIndex, index);
        dfs(node.left, 2 * index + 1);
        dfs(node.right, 2 * index + 2);
    };

    dfs(root, 0);

    return maxIndex === nodeCount - 1;
};
Last Updated:
Contributors: rosendo
Prev
[887] 鸡蛋掉落
Next
[98] 验证二叉搜索树