码迷,mamicode.com
首页 > 其他好文 > 详细

My集合框架第三弹 AVL树

时间:2015-03-04 09:38:39      阅读:146      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!