标签:
旋转操作:
由于任意一个结点最多只有两个儿子,所以当高度不平衡时,只可能是以下四种情况造成的:
1. 对该结点的左儿子的左子树进行了一次插入。
2. 对该结点的左儿子的右子树进行了一次插入。
3. 对该结点的右儿子的左子树进行了一次插入。
4. 对该结点的右儿子的右子树进行了一次插入。
向AVL树插入节点后,需要让AVL树重新平衡
step1:从插入节点向根节点溯源,观察是否存在不平衡节点(左右子树高度差),
if(不存在),return
else step2
step2:标记不平衡节点为K1
if(K1.left.depth>K1.right.depth) step3;
else step4;
step3:根据插入值和K2元素值比较
if(K3<K2.element) 情形1;
else 情形2;
step4:if(K3<K2.element) 情形3;
else 情形4;
情形1:
K1为不平衡节点,K3为插入节点
经过一次单旋转,变为
代码实现
public AvlNode<AnyType> rotateWithLeftChild(AvlNode<AnyType> K1){ AvlNode<AnyType> K2 = K1.left; K1.left = K2.right; K2.right = K1; //更新高度(省略) return K2; }
注意:一定要更新父节点的左子树的指向
情形4与情形1对称,不在赘述
情形2:对应于左右双旋
为了描述清楚,即使树中的节点为null,仍然标记为字母ABCD
K1为不平衡节点
step1:K2
以K2为不平衡节点左旋,得到
继续以K1为不平衡节点右旋,得到平衡
代码:
public AvlNode<AnyType> doubleWithLeftChild(AvlNode<AnyType> K1){ K1.left = rotateWithRightChild(K1.left); return rotateWithLeftChild(K1); }
情形3与之对称
标签:
原文地址:http://www.cnblogs.com/kakaxisir/p/4312363.html