查缺补漏----数据结构树高总结

① 对于平衡二叉树而言,树高的规律:

高度为h的平衡二叉树的含有的最少结点数(所有非叶节点的平衡因子均为1):

n0=0,n1=1,n2=2

n_h=n_{h-1}+n_{h-2}+1

含有的最多结点数:

2^h-1(高度为h的满二叉树含有的结点数)

② 对于折半查找判定树树高:(和完全二叉树相同)

n=\left \lfloor log_2{n} \right \rfloor+1 或者\left \lceil log_2{(n+1)} \right \rceil

补充:折半查找最多比较次数为\left \lfloor log_2n \right \rfloor+1

③ 对于二叉排序树的树高:

最大为n,最小:\left \lceil log_2{(n+1)} \right \rceil

④ 红黑树的树高的性质:

1.从根节点到叶节点的最长路径不大于最短路径的2倍。

这是每条路径上的黑结点相同,并且不能出现相邻的红节点导致的。

2.红黑树中任何左子树和右子树的高度差,不会超过两倍。

3.若根节点黑高为h,内部结点数(关键字)最少2^h-1个。(满树的结点数)。

最多有2^{2h}-1个。

4.若红黑树总高度=h,则根节点黑高>=h/2,因为不能出现相邻的两个红节点。又因为内部节点数n\geq 2^{\frac{h}{2}}-1,所以:h\leq 2log_{2}(n+1)

⑤ 对于B树:m表示阶数

最小高度

若要让B树的高度最小,在关键字数量不变的情况下,应该让每棵树尽可能满。对于m阶B树而言,每个结点最多有m-1个关键字以及m个分叉,则:

最大高度:

最大高度---让各层的分叉尽可能的少,即根节点只有2个分叉,其他结点只有个分叉。各层结点至少有:第一层 1、第二层 2、第三层.... 第h层,第h+1层共有叶子结点(失败结点):个(第h+1层是叶子结点,则该树有h层)。

为什么n个关键字的B树有n+1个叶子结点?因为n个关键字把(-∞,+∞)分为了n+1个区域,这n+1个区域对应n+1种失败的情况,即n+1个失败节点(叶子结点)。

⑥ 对于败者树:败者树是一棵完全二叉树,如下图所示:

注意:其实冠军结点不需要额外空间进行保存

不算冠军结点,败者树得树高是\left \lceil log_2k \right \rceil+1,如下图所示是6个初始结点的败者树

补充:败者树的查找深度是:\left \lceil log_2k \right \rceil

假设k路归并对应的败者树树高为h(这里的h不包括最上面的头),对于1棵完全二叉树,第h层最多有2^{h-1}个节点,k路归并的败者树叶子节点为k,所以k\leq 2^{h-1}

所以h-1=\left \lceil log_2{k} \right \rceil对比的次数刚好和分支结点(下面的灰色结点)的层数相同,分支节点的层数为h-1,所以关键字对比次数=\left \lceil log_2{k} \right \rceil

假设需要进行1024路归并,按照传统的方法,每次从1024个关键字中挑选最小的关键字,需要1023次对比,而采用败者树,只需要\left \lceil log_2{k} \right \rceil,也就是10次对比。很显然,大大减少了关键字对比的次数。

注意:\left \lceil log_2{k} \right \rceil其实是关键字对比的上限。在如下图所示的五路归并的败者树中:

\left \lceil log_2{k} \right \rceil=\left \lceil log_2{5} \right \rceil=3

但是,若填补的新元素在b0,b1,b2的位置,他们中间的分支节点只有2层,只需要对比2次,对于b3,b4位置填补的新元素,则需要对比3次。

⑦ 对于m叉树:

(1)度为 m 的树第 i 层至多有 m^{i-1} 个结点(i>=1),所以m叉树第 i 层至多有 m^{i-1} 个结点(i>=1)。

(2)高度为 h 的 m 叉树至多有 \frac{m^h-1}{m-1} 个结点。

(3)对于度为m的数而言,高度为h、度为m的树至少有 h+m-1 个结点。

(4)具有n个结点的m叉树的最小高度为\left \lceil log_{m}(n(m-1)+1) \right \rceil

整理一下得到:

m^h-1<n(m-1)+1\leq m^h

对三个部分分别取对数:

h-1< log_{m}(n(m-1)+1) \leq h

由于中间部分要大于h-1,所以h最小为

h= \left \lceil log_{m}(n(m-1)+1) \right \rceil


对于树高不记得公式也没事,根据性质现推就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值