AVL平衡树的旋转
2012-06-05 19:30
176 查看
AVL平衡树的旋转
平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找、插入和删除操作在平均和最坏情况下时间复杂度都是O(log n)AVL树的旋转一共有四种情形,注意所有旋转情况都是围绕着使得二叉树不平衡的第一个节点展开的。
1. LL型
平衡二叉树某一节点的左孩子的左子树上插入一个新的节点,使得该节点不再平衡。这时只需要把树向右旋转一次即可,如图所示,原A的左孩子B变为父结点,A变为其右孩子,而原B的右子树变为A的左子树,注意旋转之后Brh是A的左子树(图上忘在A于Brh之间标实线)
2. RR型
平衡二叉树某一节点的右孩子的右子树上插入一个新的节点,使得该节点不再平衡。这时只需要把树向左旋转一次即可,如图所示,原A右孩子B变为父结点,A变为其左孩子,而原B的左子树Blh将变为A的右子树。
3. LR型
平衡二叉树某一节点的左孩子的右子树上插入一个新的节点,使得该节点不再平衡。这时需要旋转两次,仅一次的旋转是不能够使二叉树再次平衡。如图所示,在B节点按照RR型向左旋转一次之后,二叉树在A节点仍然不能保持平衡,这时还需要再向右旋转一次。
4. RL型
平衡二叉树某一节点的右孩子的左子树上插入一个新的节点,使得该节点不再平衡。同样,这时需要旋转两次,旋转方向刚好同LR型相反。
下面是一些例子:
具体步骤如下:
⑴ 每当插入一个新结点,从该结点开始向上计算各结点的平衡因子,即计算该结点的祖先结点的平衡因子,若该结点的祖先结点的平衡因子的绝对值均不超过1,则平衡二叉树没有失去平衡,继续插入结点;
⑵ 若插入结点的某祖先结点的平衡因子的绝对值大于1,则找出其中最小不平衡子树的根结点;
⑶ 判断新插入的结点与最小不平衡子树的根结点的关系,确定是哪种类型的调整;
⑷ 如果是LL型或RR型,只需应用扁担原理旋转一次,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;如果是LR型或LR型,则需应用扁担原理旋转两次,第一次最小不平衡子树的根结点先不动,调整插入结点所在子树,第二次再调整最小不平衡子树,在旋转过程中,如果出现冲突,应用旋转优先原则调整冲突;
⑸ 计算调整后的平衡二叉树中各结点的平衡因子,检验是否因为旋转而破坏其他结点的平衡因子,以及调整后的平衡二叉树中是否存在平衡因子大于1的结点。
设有关键码序列{20, 35, 40, 15, 30, 25, 38},图7-3给出了平衡二叉树树的构造过程,结点旁边标出的是该结点的平衡因子。
声明:本文采用
BY-NC-SA 进行授权 |版权所有©
EnjoyDiy
转载需注明 转自: 《AVL平衡树的旋转》
相关文章推荐
- js实现图片旋转
- iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
- 纯html jquery 实现加载效果(图片旋转)
- 第一章_左旋转字符串
- 安卓学习笔记之-camera实现图片的3D旋转
- 旋转图像-计算机一2014 北邮机试题目
- Unity3D 控制物体移动、旋转、缩放
- android全屏和取消全屏 旋转屏幕
- C语言数据结构旋转链表的实现
- IOS CGAffineTransform 用于视图平移,放缩,旋转
- opencv 如何提取旋转矩形的ROI
- poj_3301_三分_凹函数_求能覆盖N个点的最小正方形_对坐标系旋转_求新坐标
- 摄像头camera 旋转90度 解决方法
- 关于iOS TableView旋转后头部空白的问题
- 在PC或者手机端旋转、移动、缩放模型
- 《算法导论》笔记 第13章 13.2 旋转
- iOS旋转屏幕后,不显示状态栏
- 前端页面给指定的div添加遮罩层,并且带有加载中的小旋转图片
- Unity3d控制物体的旋转以及缩放
- Offer题8 旋转数组的最小值