http://www.cppblog.com/emptysoul/archive/2008/11/25/67750.html
上面文章很好的介绍了AVL树,只不过其程序中左旋和右旋写的有点问题,但是其AVL的建立过程还是写得相当不错的。
其实AVL树就是左右子树高度不能相差大于1的查找二叉树。在这里注意三点问题。
第一:插值需要分类讨论。第一层是插值在父节点p的左子树还是右子树上。
1:在左子树上。如果在左子树,那么后续插值是在左子树还是右子树。
a:如果在左子树上。因为这时候是在左子树的左子树上。如果这时候因为插值引起了(父节点p的左子树高度-p的右子树高度=2),那么只要对p的左子树节点进行右转即可;
b:如果在右子树上。因为这时候在左子树的右子树上。这是如果因为插值引起了(父节点p的左子树高度-p的右子树高度=2),那么先对父节点p的左子树的右子树(即插 入点)进行左旋,在对父节点p的左子树进行右旋即可。
2:如果在右子树上。后面的讨论一样,即一顺溜的一次旋转,交叉的交叉旋转。每次旋转方向就是纠正上次插值的方向。
第二:在通过对父节点p的高度修正后,不需要对其他节点的高度修正。这是其插入操作,不涉及到其他节点。
第三:在建立好AVL树后,其他的比如insert、delete操作和原来的普通二叉树类似。只不过在其中加入判定删除或者插入后其父节点的左右子树的高度差的绝对值是否大于1,如果大 于在进行上面类似的旋转即可。注意,这里插入只需要判定父节点p本身,因为其不涉及到节点。而删除操作要涉及到其他节点的重新分布,所以要对所有的高度差值进行更 新。