平衡搜索树

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


准备知识

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


AVL树

1.定义

平衡搜索树_第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.平衡因子

平衡搜索树_第2张图片

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


6.插入、删除

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


红黑树

1.定义

平衡搜索树_第3张图片

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


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叉搜索树

平衡搜索树_第4张图片

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

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

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

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


2.B-树

平衡搜索树_第5张图片

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

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

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

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


3.B+树

平衡搜索树_第6张图片

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

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

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

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

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

你可能感兴趣的:(数据结构)