1 | 给出一个完全二叉树,求出该树的节点个数。 |
规定根节点位于第 $0$ 层,完全二叉树的最大层数为 $h$ 。根据完全二叉树的特性可知,完全二叉树的最左边的节点一定位于最底层,因此从根节点出发,每次访问左子节点,直到遇到叶子节点,该叶子节点即为完全二叉树的最左边的节点,经过的路径长度即为最大层数 $h$。
当 $0 \le i < h$ 时,第 $i$ 层包含 $2^i$ 个节点,最底层包含的节点数最少为 $1$,最多为 $2^h$ 。
当最底层(叶子节点所在层)包含 $1$ 个节点时,完全二叉树的节点个数是
$\sum_{i=0}^{h-1} 2^{i}+1=2^{h}$
当最底层包含 $2^h$个节点时,完全二叉树的节点个数是
$\sum_{i=0}^{h} 2^{i}=2^{h+1}-1$
如何判断第 $k$ 个节点是否存在呢?如果第 $k$ 个节点位于第 $h$ 层,则 kk 的二进制表示包含 $h+1$ 位,其中最高位是 $1$,其余各位从高到低表示从根节点到第 $k$ 个节点的路径,$0$ 表示移动到左子节点,$1$ 表示移动到右子节点。通过位运算得到第 $k$ 个节点对应的路径,判断该路径对应的节点是否存在,即可判断第 $k$ 个节点是否存在。
1 | class Solution { |
参考文献
1 | 作者:LeetCode-Solution |