-- 二叉树 - 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
}