文章中部分内容和思路来自《数据结构、算法与应用 c++语言描述》
如果搜索树的高度总是O(logn),我们就能保证查找、插入和删除的时间为O(logn),最坏情况下高度为O(logn)的树称为平衡树
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
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)所有关键字都在叶子节点出现