博客 > 数据结构&算法
# 完全二叉树的题型 ## 已知深度,求一些属性 - 最后一层节点数上限为:$2^{k-1}$(即满二叉树) - 总节点数上限为:$2^k-1$(即满二叉树) ## 已知结点数,求深度(高度) - 将结点数用二进制表示出来,位数就是高度。 - 也可以数学计算:$\lfloor\log_2n\rfloor+1$ ## 已知结点数,求叶子结点数 1. 求出深度,以及最后一层的节点数$n$和空位数$m$ 1. 叶子结点数 = $n+\lfloor m/2 \rfloor$ ## 已知结点数,求空指针数 1. 求出深度,以及最后一层的节点数$n$和空位数$m$ 2. 空指针数 = $ \begin{cases} 2\times 叶子结点数+1&,n和m为奇数\\ 2\times 叶子结点数&, n和m为偶数 \end{cases} $ ## \*已知叶子节点数,求可能深度 > 懒人直接看结论 ### 推导 其实就是构造方程和不等式。 已知叶子节点数为$n$,设深度为$k$,最后一层的空位数为$x$,有如下等式: $$ n=2^{k-1}-x+\lfloor \dfrac{x}2\rfloor \\ $$ 分类讨论,整理得 $$ \begin{align} &当x为奇数时:x=2^k-2n-1 \\ &当x为偶数时:x=2^k-2n \end{align} $$ 又有不等式 $0\le x\lt 2^{k-1}$,当且仅当 $x$ 为偶数时有可能取$0$(树为满二叉树),得 $$ \begin{align} &&当x为奇数时:&2^k\gt 2n+1 \gt 2^{k-1} \\ &&当x为偶数时:&2^k\ge 2n \gt 2^{k-1} \\ \end{align} $$ 不等式各边都大于0,所以可同时取以2为底的对数,得 $$ \begin{align} &&当x为奇数时:&k\gt \log_2{(2n+1)} \gt k-1 \\ &&当x为偶数时:&k\ge \log_2{2n} \gt k-1 \\ \end{align} $$ 由此可得$k$的取值范围(这里还不是最简形式,不用记): $$ \begin{align} &&当x为奇数时:&k=\lceil\log_2{(2n+1)}\rceil \\ &&当x为偶数时:&k=\lceil\log_2{2n}\rceil \\ \end{align} $$ 由于本题并未给出$x$的奇偶性,我们把两种情况都试一下就行了。如有1个叶子节点的完全二叉树可能为1层或2层,有2个叶子节点的可能为2层或3层(因x的奇偶而不同),有3个叶子节点的一定为3层(不论x奇偶,结果一致),有4个叶子节点的可能为3层或4层……以此类推。 特别地,我们可以归纳整理,并且把向上取整变成我们熟悉的向下取整,得到结论(这是最简形式!) ### 结论 **当叶子节点数$n$恰好为2的次方时,树深有两种可能情况 $\log_2{n}+1$ 和 $\log_2{n}+2$,分别是满二叉树和下面有一个;如果不为2的次方,则必然只有一种树深,即$\lfloor\log_2{n}\rfloor+2$。NICE!** $$ \begin{cases} k\in \{ \log_2{n}\ + 1,\ \log_2{n}\ +2 \} &, \log_2n \in \mathbb{Z} \\ k= \lfloor \log_2{n} \rfloor +2 &, \log_2n \notin \mathbb{Z} \end{cases} $$ --- 另附一种快速推算方式: 比如求273个叶子节点的完全二叉树有几层,那我首先想一个满二叉树有256个叶子节点,然后再往下一层走叶子节点会慢慢变多,但是没有多到512个。也就是说这棵树的深度是比256个叶子节点的满二叉树的深度还高1,256个叶子节点的满二叉树根据$2^{k-1}$算出来$k$是9,那这个273个的树就是10了!当然根据上述公式 $\lfloor \log_2{273}\rfloor +2=10$ 结果是一样的。