AVL树的旋转操作详解
2017-04-27 22:51
204 查看
作者:
连接:http://www.cnblogs.com/cherryljr/p/6669489.html
0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205
0.1) 本文仅针对性地分析AVL树的单旋转(左左单旋转和右右单旋转)和 双旋转(左右双旋转和右左单旋转)的内部核心技巧;
0.2) 不得不提的是,旋转有两个属性: 轴 和 旋转方向; (旋转轴即是原最小树经过旋转修正后的符合AVL的最小树的根节点)
0.3) 旋转轴的确定 : (干货——单双旋转的旋转轴确定问题)
0.3.1)单旋转:旋转轴为 不满足AVL条件的最小树的树根的相应孩子节点;
0.3.2)多旋转:旋转轴为 不满足AVL条件的最小树的树根的相应孙子节点;
1.0)高度不平衡需要α点的两棵子树高度差为2,故可得高度不平衡可能出现在下面四种情况中:
① 对α的左儿子的左子树进行一次插入。
② 对α的左儿子的右子树进行一次插入。
③ 对α的右儿子的左子树进行一次插入。
④ 对α的右儿子的右子树进行一次插入。
1.1)单旋转: 插入点不介于 不满足AVL条件的树根 和 树根对应孩子节点之间; (情形①、③
即 左-左、右-右)
1.2)双旋转:插入点介于 不满足AVL条件的树根 和 树根对应孩子节点之间;(情形②、④
即 左-右、右-左)
2.1)左左旋转(顺时针旋转): 从插入点回溯到第一个不满足AVL条件的节点;本例中,插入点是10, 而第一个不满足AVL条件的节点是30;将回溯路径上的节点除节点30外,上移一层,节点30下移一层;
case1)
Attention)
A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成;
(干货:也即是, 左左单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管 该树的左子树的右孩子 或者存在 或者 不存在,在旋转过程中,都要把该左子树的的右孩子添加以作为最小树根的左孩子,因为即使不存在,添加null 也不影响最后的旋转效果)
case2)
2.2)右右旋转(逆时针旋转): 从插入点回溯到第一个不满足AVL条件的节点;本例中,插入点是10, 而第一个不满足AVL条件的节点是30;将回溯路径上的节点除节点30外,上移一层,节点30下移一层;
case1
Attention)
A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成;
(干货:也即是, 右右单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管 该树的右子树的左孩子 或者存在 或者 不存在,在旋转过程中,都要把该右子树的左孩子添加以作为最小树根的右孩子,因为即使不存在,添加null 也不影响最后的 旋转效果)
case2)为什么经过右右单旋转就可以修正成为 AVL 树;因为 new point = 13 不在 4 和 7 之间, 所以一次单旋转就可以了,无需双旋转;
(干货——也就是说,new point 介于 不满足AVL条件的树根 和 其 孩子 之间的话,那么就需要双旋转, 否则, 只需要 单旋转就可以了)
Conclusion of single rotation)单旋转有两个属性: 轴 和 旋转方向
C1)单旋转的轴: 相信你也看到了, 单旋转的轴显然是不符合AVL条件的树根的直接孩子;
C1.1)左左单旋转的轴:是不符合AVL条件的树根的左孩子;
C1.2)右右单旋转的轴:是不符合AVL条件的树根的右孩子;
C2)旋转方向:
C2.1)左左单旋转方向:顺时针方向;
C2.2)右右单旋转方向:逆时针方向;
3.1)左右双旋转: (先左左单旋转,再右右单旋转; 即先顺时针旋转,后逆时针旋转)
case1)因为47 介于 40 和 50 之间, 所以肯定需要双旋转;
3.2)右左双旋转:先将节点15向上提,还是不满足AVL树的条件,再把节点7向上提;(先右右单旋转,再左左单旋转; 即先逆时针旋转,后顺时针旋转)
Conclusion of double rotations) 双旋转有两个属性: 轴 和 旋转方向
C1)双旋转的轴:相信你也看到了, 双旋转的轴显然是插入点的直接父节点;(除了两个特例) (干货——双旋转的轴显然是插入点的直接父节点(除了两个特例,
而两个特例的轴是插入点本身))
C1.1)左右单旋转的轴:插入点的父节点;
C1.2)右左单旋转的轴:插入点的父节点;
C2)旋转方向:
C2.1)左右单旋转方向:先右右单旋转,再左左单旋转;即先逆时针旋转,再顺时针旋转;
C2.2)右左单旋转方向:先左左单旋转,再右右单旋转;即先顺时针旋转,再逆时针旋转;
樱の空
连接:http://www.cnblogs.com/cherryljr/p/6669489.html
【0】README
0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205 0.1) 本文仅针对性地分析AVL树的单旋转(左左单旋转和右右单旋转)和 双旋转(左右双旋转和右左单旋转)的内部核心技巧;
0.2) 不得不提的是,旋转有两个属性: 轴 和 旋转方向; (旋转轴即是原最小树经过旋转修正后的符合AVL的最小树的根节点)
0.3) 旋转轴的确定 : (干货——单双旋转的旋转轴确定问题)
0.3.1)单旋转:旋转轴为 不满足AVL条件的最小树的树根的相应孩子节点;
0.3.2)多旋转:旋转轴为 不满足AVL条件的最小树的树根的相应孙子节点;
【1】 如何判断进行单旋转还是双旋转 (干货——什么时候需要单旋转,而什么时候需要多旋转?)
1.0)高度不平衡需要α点的两棵子树高度差为2,故可得高度不平衡可能出现在下面四种情况中:① 对α的左儿子的左子树进行一次插入。
② 对α的左儿子的右子树进行一次插入。
③ 对α的右儿子的左子树进行一次插入。
④ 对α的右儿子的右子树进行一次插入。
1.1)单旋转: 插入点不介于 不满足AVL条件的树根 和 树根对应孩子节点之间; (情形①、③
即 左-左、右-右)
1.2)双旋转:插入点介于 不满足AVL条件的树根 和 树根对应孩子节点之间;(情形②、④
即 左-右、右-左)
【2】单旋转
2.1)左左旋转(顺时针旋转): 从插入点回溯到第一个不满足AVL条件的节点;本例中,插入点是10, 而第一个不满足AVL条件的节点是30;将回溯路径上的节点除节点30外,上移一层,节点30下移一层;case1)
(这是一个左右双旋转特例,当不符合AVL条件的树根和插入点的父节点只有一个子节点,且相反方向的子节点,当然了,插入点要介于树根和插入点父节点之间的话,才满足 双旋转特例的条件) |
A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成;
(干货:也即是, 左左单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管 该树的左子树的右孩子 或者存在 或者 不存在,在旋转过程中,都要把该左子树的的右孩子添加以作为最小树根的左孩子,因为即使不存在,添加null 也不影响最后的旋转效果)
case2)
2.2)右右旋转(逆时针旋转): 从插入点回溯到第一个不满足AVL条件的节点;本例中,插入点是10, 而第一个不满足AVL条件的节点是30;将回溯路径上的节点除节点30外,上移一层,节点30下移一层;
case1
(这是一个右左双旋转特例,当不符合AVL条件的树根和插入点的父节点只有一个子节点,且相反方向的子节点,当然了,插入点要介于树根和插入点父节点之间的话,才满足 双旋转特例的条件) |
A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成;
(干货:也即是, 右右单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管 该树的右子树的左孩子 或者存在 或者 不存在,在旋转过程中,都要把该右子树的左孩子添加以作为最小树根的右孩子,因为即使不存在,添加null 也不影响最后的 旋转效果)
case2)为什么经过右右单旋转就可以修正成为 AVL 树;因为 new point = 13 不在 4 和 7 之间, 所以一次单旋转就可以了,无需双旋转;
(干货——也就是说,new point 介于 不满足AVL条件的树根 和 其 孩子 之间的话,那么就需要双旋转, 否则, 只需要 单旋转就可以了)
Conclusion of single rotation)单旋转有两个属性: 轴 和 旋转方向
C1)单旋转的轴: 相信你也看到了, 单旋转的轴显然是不符合AVL条件的树根的直接孩子;
C1.1)左左单旋转的轴:是不符合AVL条件的树根的左孩子;
C1.2)右右单旋转的轴:是不符合AVL条件的树根的右孩子;
C2)旋转方向:
C2.1)左左单旋转方向:顺时针方向;
C2.2)右右单旋转方向:逆时针方向;
【3】双旋转
3.1)左右双旋转: (先左左单旋转,再右右单旋转; 即先顺时针旋转,后逆时针旋转)case1)因为47 介于 40 和 50 之间, 所以肯定需要双旋转;
3.2)右左双旋转:先将节点15向上提,还是不满足AVL树的条件,再把节点7向上提;(先右右单旋转,再左左单旋转; 即先逆时针旋转,后顺时针旋转)
Conclusion of double rotations) 双旋转有两个属性: 轴 和 旋转方向
C1)双旋转的轴:相信你也看到了, 双旋转的轴显然是插入点的直接父节点;(除了两个特例) (干货——双旋转的轴显然是插入点的直接父节点(除了两个特例,
而两个特例的轴是插入点本身))
C1.1)左右单旋转的轴:插入点的父节点;
C1.2)右左单旋转的轴:插入点的父节点;
C2)旋转方向:
C2.1)左右单旋转方向:先右右单旋转,再左左单旋转;即先逆时针旋转,再顺时针旋转;
C2.2)右左单旋转方向:先左左单旋转,再右右单旋转;即先顺时针旋转,再逆时针旋转;
相关文章推荐
- AVL树的旋转操作详解
- AVL树的旋转操作 图解 最详细
- AVL树的旋转操作 图解 最详细
- IOS 七种手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)详解及实例代码
- AVL树的旋转、插入、 详解
- 以AVL树为例理解二叉树的旋转(Rotate)操作
- AVL树旋转操作图解
- EasyPR--开发详解(4)形态学操作、尺寸验证、旋转等操作
- AVL树的旋转操作
- AVL树的插入操作(旋转)图解
- AVL树的旋转操作 图解 最详细
- 数据结构&&AVL树原理、插入操作详解及实现
- 平衡二叉树(AVL树的定义,旋转详解)
- 以AVL树为例理解二叉树的旋转(Rotate)操作
- AVL树的旋转详解
- AVL树的旋转操作 图解 最详细
- 数据结构:关于AVL树的平衡旋转详解
- 以AVL树为例理解二叉树的旋转(Rotate)操作
- 【AVL树】AVL树的插入操作以及旋转
- AVL树的旋转操作 图解 最详细