AVL树的LR和RL旋转
来源:互联网 发布:易语言编程如何写 编辑:程序博客网 时间:2024/06/05 18:29
AVL树是指在一颗二叉树中,任一个结点的平衡因子都不超过1。一个节点的平衡因子是该节点的右子树的高度与左子树的高度的差。
为什么要有AVL树?
AVL树通常被用在二叉搜索树(BST)中,BST是满足这样条件的二叉树:树中任一节点的左子树根节点的值小于根节点的值,根节点的值小于右子树根节点的值。
在一颗二叉搜索树查找一个值的平均时间复杂度为log(n),但是若BST所有的节点向一边倾斜,这时候的查找就退化为线性查找,复杂度为n。为了获得更高的查找效率,就有了AVL树的概念,对于一颗非平衡的AVL树,可以通过旋转变换为AVL树。
BST是对基于数组存储元素的一种变治(改变表现),从而提高了查找的效率,BST还有很多变种,这些都是基于BST的变治。如下:
将一颗非平衡的树通过旋转转换为AVL树。只叙述LR旋转
LR旋转:
引起LR旋转的原因一般为在一个节点(如1号节点)的左子树(L)根节点的右子树(R)上插入了一个节点,使1号节点失去平衡,如左图中红色的6号节点。
L旋转的规则:
对失去平衡节点(1号)的左子树(根节点为2)进行L操作
这里1的左子树的根节点为2,L操作为2的右子树的根节点(4号)作为新的根节点,2连同它的左子树作为新的根节点(4号)的左子树,原来4号节点的左子树(这里为空)作为改变后2这个节点的右子树,原来4的左子树(6号)继续作为4的右子树。L旋转后如上右图。
如上L旋转完后,1号节点还是不平衡的,此时还要进行R旋转。
R旋转的规则:
对失去平衡的节点(1号节点)进行R操作
失去平衡节点(1号)的左子树的根节点(4号)作为新的根节点,原来的根节点(1号)连同它的右子树(5号)作为新的根节点(4号)的右子树,新的根节点(4号)原来的右子树(6号)作为现在右子树根节点(1号)的左子树,如上右图。
RL旋转和LR类似,一般是由一个节点右子树根节点的左子树添加一个节点引起的。
旋转的时候,是先对失去平衡节点的右子树进行R操作,然后对失去平衡的节点进行L操作。
对于单独的L旋转和R旋转,可以看出是上面过程中的一部分。
引起L旋转的原因是:在某个节点(如1)的右子树(R)根节点的右子树(R)中插入一个节点,使1号节点失去平衡,这时候需要L旋转。
引起R旋转的原因就相反了,在某个节点(如1)的左子树(L)根节点的左子树(L)中插入一个节点,使1号节点失去平衡,这时候需要R旋转。
- AVL树的LR和RL旋转
- AVL树的旋转LL RR LR RL
- AVL树,平衡二叉树的LL,LR ,RR,RL旋转
- AVL树的平衡调整,LL,LR,RR,RL旋转 (二)
- 【数据结构】AVL树的旋转和插入
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- AVL树的旋转
- 把爱融入程序——程序,源自生活,高于生活
- 二叉树中序遍历
- 关于fedora中ipv6使用的一些心得
- 二叉树后序遍历
- hdu 4411 Arrest(最小费用最大流)
- AVL树的LR和RL旋转
- 支持向量机通俗导论(理解SVM的三层境界)
- HDU 1033 Edge
- IOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- LeetCode: Binary Tree Level Order Traversal II
- java基础学习__多线程(停止线程,守护线程,join方法)
- HDU 4393
- TCP三次握手四次挥手详解