题目:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
算法:
因为完全二叉树的性质,root节点总有一个子树为完全二叉树。
T(n) = T(n/2) + logn
T(n/2)遍历子树为非完全二叉树,每个节点执行logn求height,总共次数为
n/2 + (n/2 -1) + (n/2 - 2) + (n/2 - 4) + (n/2 - 8)... 1=logn
T(n) = logn * logn
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
lh, rh := 0, 0
left := root.Left
for left != nil {
lh ++
left = left.Left
}
right := root.Right
for right != nil {
rh ++
right = right.Right
}
if lh == rh {
// 左右节点高度都是lh,加上根节点高度lh + 1
return (1 << (lh + 1)) - 1
}
return countNodes(root.Left) + countNodes(root.Right) + 1
}