先统一表示
我们知道,节点的度
表示:一个节点有几个子节点。如:度为2的节点,有两个子节点。
对于二叉树来说,节点度的种类只有三种,我们分别用下面的方法表示树节点:
- 度为2的节点表示为 n2
- 度为1的节点表示为 n1
- 度为0的节点表示为 n0
(n0 = n2 + 1) 怎么得到的?
往往这样的公式,来自善于观察之人的总结,推导过程其实也不复杂,你需要明白两件事情:
- 节点总数为N的二叉树,仅由三种节点组成,所以有:N=n2+n1+n0
- 树是一对多关系的呈现,每个节点都有唯一一个父节点(除了根节点),更形象的描述应该是每个几点都有一个指向父节点的边,那么边和节点种类的规律如下:
- 向上看
- 每个节点都有一个边和父节点连接,所以总共有N-1个边,除了根节点
- 向下看
- n2 节点有2个边
- n1 节点有1个边
- n0 节点有0个边
- 所以边的总数B为: (2 x n2 + 1 x n1 + 0 x n0) = B
- 所以,边和节点数的关系为: B + 1 = N
- 向上看
有了上面的前提,我们常识推导下:
>> (2 x n2 + 1 x n1 + 0 x n0) + 1 = n2 + n1 + n0
经过两边的化简结果为:
>> n2 + 1 = n0
看,很简单吧,最后你要记住对于二叉树来说:n0=n2+1
这个事实。
二叉树指针域的空闲计算
每个树都会有叶子,也就是终端节点
,他们的指针域是没有被使用的,同样的,你也知道有一个子节点的节点,它也有一个指针域没有被使用。
那么对于一个二叉树来说,有多少指针域没有被使用呢?其实他是有一个定律的,就是:如果二叉树有N个节点,那么没有使用的指针域为N+1
,这个怎么来的?
我们推导下,先看看前提:
- 每个节点有两个指针域,那么N个节点的树就有2N个指针域
- 不同种类的节点用的指针域的个数:
- n2 用了2个
- n1 用了1个
- n0 用了0个
所以,通过上面的前提,我们来计算下没有被使用的指针域
的个数,我们表示它为W,
>> 2 x N = 2 x (n2 + n1 + n0) = W + (2 x n2 + 1 x n1 + 0 x n0)
两边化简后:
>> W = n1 + 2 x n0
这个看起来和我们要得到的结论没有联系啊,先别急,我们前面不是有一个n0 = n2 + 1
这个事实么?带入看看:
>> W = n1 + 2 x n0 = n1 + n0 + (n2 + 1)
>> N = n0 + n1 + n2
替换并化简后
W = n1 + n0 + n2 + 1 = N + 1
好了,这回得到了W = N + 1
了,神奇么?
没有使用的指针域是这么多,那用了的自然就是N - 1
了,因为总共就2N
啊。
其实,还有一个更简单的思考方向,而用的也是我们已知的前提
- 二叉树的边的个数,就是总节点数N减去1
- 每个边便是一个指针域的表示
好了,有了这些,你就知道,总共有N个节点的二叉树,应该有2N个指针域,有N-1个边(根指针并没有父亲),也就用了N-1个指针域,剩下的,就只有(2N - N - 1) = N + 1
。