AVL树的旋转操作详解

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树的旋转操作详解

 

AVL树的旋转操作详解

 
    (这是一个左右双旋转特例,当不符合AVL条件的树根和插入点的父节点只有一个子节点,且相反方向的子节点,当然了,插入点要介于树根和插入点父节点之间的话,才满足 双旋转特例的条件)  

Attention)

A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成; 
(也即是, 左左单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管该树的左子树的右孩子或者存在或者不存在,在旋转过程中,都要把该左子树的的右孩子添加以作为最小树根的左孩子,因为即使不存在,添加null 也不影响最后的旋转效果)

case2) 

这里写图片描述

2.2)右右旋转(逆时针旋转): 从插入点回溯到第一个不满足AVL条件的节点;本例中,插入点是10, 而第一个不满足AVL条件的节点是30;将回溯路径上的节点除节点30外,上移一层,节点30下移一层;

case1 

AVL树的旋转操作详解

 

AVL树的旋转操作详解

 
   
(这是一个右左双旋转特例,当不符合AVL条件的树根和插入点的父节点只有一个子节点,且相反方向的子节点,当然了,插入点要介于树根和插入点父节点之间的话,才满足 双旋转特例的条件)
 

Attention)

A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成; 
(也即是, 右右单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管该树的右子树的左孩子或者存在或不存在,在旋转过程中,都要把该右子树的左孩子添加以作为最小树根的右孩子,因为即使不存在,添加null 也不影响最后的 旋转效果)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d36e1eaa9fe39c12f09ec4a1b9243113.html