Skip to content

Latest commit

 

History

History
72 lines (57 loc) · 1.92 KB

39_二叉树_222. 完全二叉树的节点个数.md

File metadata and controls

72 lines (57 loc) · 1.92 KB

-- 二叉树 - mid 点击直达力扣

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:

输入:root = [1,2,3,4,5,6]
输出:6

示例 2:

输入:root = []
输出:0

示例 3:

输入:root = [1]
输出:1

普通解法:后序遍历统计所有节点

function countNodes(root: TreeNode | null): number {
    return getNum(root)
};

function getNum(root: TreeNode | null): number {
    if (root === null) {
        return 0
    }
    let leftNum = getNum(root.left)
    let rightNum = getNum(root.right)
    return 1 + leftNum + rightNum
}

利用完全二叉树的特性:叶子节点一定是连续的

当某一个节点为满二叉树时,直接使用公式:2^n-1 来统计该节点的数量

function countNodes(root: TreeNode | null): number {
    return getNum(root)
};

function getNum(root: TreeNode | null): number {
    if (root === null) {
        return 0
    }
    // 判断该子树是否为满二叉树:若为满二叉树(leftDepth == rightDepth),则直接使用公式返回结果,不需要遍历所有节点统计数量
    let [left, right] = [root.left, root.right]
    let [leftDepth, rightDepth] = [0, 0]
    while (left) {
        leftDepth++
        left = left.left
    }
    while (right) {
        rightDepth++
        right = right.right
    }
    if (leftDepth == rightDepth) {
        return (2 << leftDepth) - 1
    }

    let leftNum = getNum(root.left)
    let rightNum = getNum(root.right)
    return 1 + leftNum + rightNum
}