Avl树旋转方式

给定一个平衡二叉树,对其进行插入操作.

Avl树旋转方式

上图是一颗平衡二叉树,满足每一个节点的左右子树都不大于1.

1.对该树的A节点的左儿子的左子树进行一次插入

得到如下的图.

Avl树旋转方式 

F即为新插入的节点,F破坏了平衡,需要重新平衡.对B和A进行一次旋转即可,将A的左儿子旋转到A的位置.

旋转后的图如下.

Avl树旋转方式 

旋转是应为A要比B大,所以A变成B的右子树,E要比B大,但比A小,所以变成A的左子树.可以想象把一个树从B哪里提起来,小的节点就向左掉,大的节点就向右掉.

private AvlNode<AnyType> rotateWithLeftChild(AvlNode A){
		AvlNode<AnyType> B=A.left;
		A.left=B.right;
		B.right=A;
		A.height=Math.Max(A.left.height(),A.right.height())+1;
		B.height=Math.Max(A.height,B.left.height())+1;
		return B;
	}

 

height()函数是用来求树的高度的函数.A的高度是左右子树的高度+1,B的高度是A的高度和B的左子树的高度的最大值

2.对A的左儿子的右子树进行一次插入.

 插入后的图如下

Avl树旋转方式

插入后也打破了平衡,但如果A和B进行一次旋转并不能解决问题,需要进行两次旋转.

先进行一次右旋转,再进行一次左旋转.

Avl树旋转方式

上图是进行一次右旋转的图,

Avl树旋转方式

上图是进行两次旋转后的图,又恢复了平衡.

3对A的右儿子的左子树进行一次插入与2类似.

4对A的右儿子的右子树进行一次插入与1类似.