首先我们先明确两个关于二叉树的基本概念:深度(depth)和高度(height)。
深度:从根节点开始(其深度为1),自顶向下逐层累加;
高度:从叶节点开始(其高度为1),自底向上逐层累加。
虽然树的高度和深度一样,但具体到某个节点,其深度和高度不一样,如:
节点10的高度为2,深度为3;节点7的高度为1,深度为3.
言归正传:
AVL树:一个空二叉树是AVL树;一个非空二叉树T的左右子树TL和TR,若T为AVL树,则TL和TR也为AVL树,且TL和TR的高度差不超过1.
AVL搜索树(AVL search tree):只不过是一个拥有AVL特性的二叉搜索树,如
一个有n个节点的AVL树的高度是O(logn),这有助于评估基于AVL树的算法的复杂度。
下面着重谈一谈AVL搜索树的基本操作:
1)搜索(search):与普通二叉搜索树的操作一样,不过算法复杂度变为O(logn);
2)插入(insert):
平衡因子(balance factor)—— 一个节点左子树的高度减去右子树的高度就是该节点平衡因子,一棵AVL树中不存在平衡因子不是1、-1或0的节点。
寻找X:维持该树的平衡因子不变,从要插入的位置向根节点上溯,找到平衡因子首先为1或-1的祖先节点,记为X。
根据X进行判断是否需要重新平衡树:
a)若X不存在,也就是说从根节点(包括根节点)到要插入的位置的路径上的节点的平衡因子都为0,这是可以判断不需要重新平衡,只需要改变路径上节点的平衡因子即可。
b)X存在,但插入后其平衡因子变为0,也不需要进行平衡,只不过X的左右子树在插入后的高度变得相等罢了。
c)当X的平衡因子由1变为2或由-1变为-2时才需要进行平衡。
不平衡(imbalance)的类型分为LL、LR和RR、RL四种类型,并对应四种旋转以达到平衡。
I)LL旋转(rotation)
II)LR旋转
III)对于RR和RL旋转也是同样的道理,LL和RR的旋转属于单旋转(single rotations),LR和RL的旋转是双旋转(double rotations)。
3)删除(delete):
维持原始平衡因子不变,如果从要删除的节点到根节点路径上的节点的平衡因子都为0,则不需要进行平衡旋转。当删除节点后调整平衡因子,从删除位置向根节点上溯,找到平衡因子首先变为2或-2的节点记为X,我们以它为根节点进行旋转。
I)R1旋转
为什么叫R1旋转?我们首先找到特殊节点X为节点15,由于删除的节点位于15的右子树,所以为R,1是因为删除前15节点左子树的根节点13的平衡因子为1,同理如果平衡因子为0,则为R0旋转,为-1,则为R-1旋转。这里的R1旋转跟上面插入用的LL旋转一模一样:
节点13顶替15的位置,13的右子树作为15的左子树,节点15接在13的右子树上。
II)R0旋转
R0旋转和LL旋转的不同在于B和X的平衡因子。
总结:其实一切都是围绕平衡因子来的,我们通过平衡因子判断是否平衡,并确定旋转区域的根节点(如上面的节点15和节点X),也是根据平衡因子我们制定旋转策略,其在算法实现上,只是根据平衡因子进行局部子树的重组,算法复杂度不论查找、插入还是删除,都为O(logn)。
分享到:
相关推荐
基于树的字典ADT 字典或地图是一种抽象数据...使用二进制搜索树(BST)实现此字典ADT 。 通过使用二进制搜索算法,该数据结构允许非常高效的查找。 该实现从创建和使用节点和链接(指针)的结构开始。 由于使用C语言,
15.1.6 AVL搜索树的删除 15.2 红-黑树 15.2.1 基本概念 15.2.2 红-黑树的描述 15.2.3 红-黑树的搜索 15.2.4 红-黑树的插入 15.2.5 红-黑树的删除 15.2.6 实现细节的考虑及复杂性分析 15.3 分裂树 15.3.1 介绍 15.3.2...
一个网络应用程序,可帮助可视化各种二叉搜索树及其操作。 由于过时 Java 小程序的激增令人沮丧,因此专门设计为 UPenn 的 CIS121 数据结构课程的工具。 此实现仅使用 Javascript 和 CSS(AngularJS、D3、CSS)运行...
第7讲。堆排序。AVL树.pdf 第9讲。最短路径问题.pdf D第10讲哈希表和哈希表.pdf 讲座01....二进制搜索树。二进制堆. 讲座8.图表。深度优先搜索和广度优先搜索:pdf 网讲座11复杂性理论导论.pdf
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及...
11.2.6 AVL搜索树的删除 332 11.3 红-黑树 334 11.3.1 基本概念 334 11.3.2 红-黑树的描述 336 11.3.3 红-黑树的搜索 336 11.3.4 红-黑树的插入 336 11.3.5 红-黑树的删除 339 11.3.6 实现细节的考虑及复杂性...
数据结构(广度优先搜索,验证括号匹配,表达式计算,递归的编译,Hash表,分段Hash,并查集,Tarjan算法,二叉堆,左偏树,二斜堆,二项堆,二叉查找树,红黑树,AVL平衡树,Treap,Splay,静态二叉查找树,2-d树,...