线段树节点个数的递推公式与通项公式

不用二叉堆而是用含有指针域的节点构造线段树的话,其所需节点个数与区间长度N的关系是什么呢?

递推公式

记f(x)表示根节点区间长度为x的线段树的节点个数, 那么有:

       / 2f(x/2) + 1, 当x>1且x为偶数时;
f(x) = | f((x+1)/2) + f((x-1)/2) + 1, 当x>1且x为奇数时;
       \ 1, 当x=1时。

这条递推公式与区间划分的递归步骤有相似之处。

通项公式

前4项的结果

x     1   2   3   4   ...
f(x)  1   3   5   7   ...

猜测:

f(x) = 2x - 1

神奇,原先的递推公式描述的竟然是奇数!

证明:

定理:“对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。”

由于线段树对区间作划分时总是分割成左右两个子区间,因此线段树里只有度为0和度为2的节点。而最终是分割至区间长度为1的叶子节点,因此所有叶子节点个数之和为根节点区间N。
n0 = N; n2 = n0 - 1; 总节点个数= n0 + n2 = 2N - 1;

原来如此。


定理n0=n2+1的证明

设二叉树总节点数目为N,有

N=N0+N1+N2——(公式1)

二叉树度数总和为 0*N0+1*N1+2*N2;
而由二叉树的图形可以看出除根节点外,每个结点上方对应着一个度(为更形象,可以理解成结点自己的头上有一根“绳子”挂着自己)(可验证当仅有根节点时也满足这个规律),所以结点总数比度数多1,则有

N=N1+2*+1——(公式2)

公式1代入公式2即可得出:

N0=N2+1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值