平衡搜索树

文章中部分内容和思路来自《数据结构、算法与应用 c++语言描述》

准备知识

如果搜索树的高度总是O(logn),我们就能保证查找、插入和删除的时间为O(logn),最坏情况下高度为O(logn)的树称为平衡树

AVL树

1.定义

一颗空的树是AVL树;如果T是一颗非空的二叉树,TL和TR分别是其左右子树,那么当T满足以下条件,则T是一颗AVL树:1)TL和TR是AVL树 2)|HL-HR|<=1,其中HL和HR分别是TL和TR的高。如图14-1,a)b)是AVL树 c)不是

2.AVL搜索树

既是AVL树,也是二叉搜索树,如图14-1b)

3.特征

1)一颗n个元素的AVL树,其高度是O(logn)

2)对于每一个n,n>=0,都存在一颗AVL树

3)对一颗n元素的AVL树,再O(高度)=O(logn)的时间内可以实现查找

4)将一个新元素插入一颗n元素的AVL树中,可以得到一颗n+1个元素的AVL树,而且插入用时为O(logn)

5)从n元素的AVL树中删除一个元素,可以得到一颗n-1个元素的AVL树,而且删除用时为O(logn) 

4.高度

对一颗高度为h的AVL树,令Nh是其最少的节点数。在最坏的情况下,根的一颗子树的高度为h-1,另一颗子树高度为h-2,而且两颗子树都是AVL树。因此有:

                   Nh= Nh-1 + Nh-2 + 1, N0 = 0且N1= 1

注意,Nh的定义与斐波契数列的定义是相似的:

                   Fn= Fn-1 + Fn-2, F0 = 0 且 F1 = 1

也可以这样来表示:Nh=Fh+2–1,h>=0(可用数学归纳法证明)。由斐波拉契定理可知Fh≈Φh-,其中Φ=(1+)/2。因此Nh≈Φh+2/-1。如果书中由n个节点,那么树的最大高度为:logΦ((n+1))-2≈1.44log2(n+2)=O(logn)

5.平衡因子

x的左子树高度-x的右子树高度,取值可能为1,0,-1

6.插入、删除

详见:https://www.2cto.com/kf/201608/537982.html

红黑树

1.定义

树中每一个节点的颜色或者是黑色,或者是红色

2.性质

1)根节点和所有外部节点都是黑色

2)在根至外部节点路径上,没有连续两个节点是红色

3)在所有根至外部节点路径上,黑色节点数目相同

3.节点的阶

该节点到外部节点黑色指针数量

4.定理

1)设从根到外部节点的路径长度(length)是该路径上的指针数量,如果P和Q是红黑树中两条从根到外部节点的路径,那么length(P)<=length(Q)

2)令h是一颗红黑树的高度(不包括外部节点),n是树的内部节点数量,而r是根节点的阶,则h<=2r;n>=2r-1;h<=2log2(n+1)

5.插入、删除

详见:https://www.cnblogs.com/liyuan989/p/4071942.html

B+、B-树

1.m叉搜索树

可以是一颗空树,如果非空,则需要满足以下条件:

1)在相应的扩充搜索树中(即用外部节点替换空指针之后获得的搜索树),每个内部节点最多可以有m个孩子以及1~m-1个元素(外部节点不含元素和孩子)

2)每一个含有p个元素的节点都有p+1个孩子

3)对任意一个含有p个元素的节点,设k1 … kp分别是这些元素的关键字。这些元素顺序排列,即k1<k2<…<kp。设c0 … cp是该节点的p+1个孩子。在以c0为根的子树中,元素的关键字小于k1;在以cp为根的子树中,元素的关键字大于kp;在以ci为根的子树中,元素的关键字大于ki而小于ki+1,其中1<=i<=p

2.B-树

是一颗m叉搜索树。如果B-树非空,那么相应的扩展树应满足以下条件:

1)根节点至少有两个孩子

2)除根节点外,所有内部节点至少有[m/2]个孩子

3)所有外部节点在同一层

3.B+树

是B-树的变体,其基本定义与B-树相同,除了:

1)非叶子节点的子树指针与关键字个数相同

2)非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1])的子树(B-树是开区间)

3)为所有叶子节点增加一个链指针

4)所有关键字都在叶子节点出现

 ====================================================================

博主有自己的个人主页啦!请求关注,请求支持。QAQ.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperYang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值