首页 > 其他 > 详细

My集合框架第三弹 AVL树

时间:2015-03-04 09:36:13      阅读:317      评论:0      收藏:0      [点我收藏+]

旋转操作:

由于任意一个结点最多只有两个儿子,所以当高度不平衡时,只可能是以下四种情况造成的:

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与之对称

 

My集合框架第三弹 AVL树

原文:http://www.cnblogs.com/kakaxisir/p/4312363.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!