AVL樹是高度平衡的二叉樹,任何節點的兩個子樹的高度差別<=1
實現AVL樹
定義一個AVL樹,AVLTree,定義AVLTree的節點內部類AVLNode,節點包含以下特性:
1.key——關鍵字,對AVL樹的節點進行排序
2.left——左子樹
3.right——右子樹
4.height——高度
如果在AVL樹插入節點後可能導致AVL樹失去平衡,具體會有四種狀態:
LL:左左,LeftLeft
LR:左右,LeftRight
RL:右左,RightLeft
RR:右右,RightRight
解決上面的情況
解決LL,需要左單旋轉
解決RR,需要右單旋轉
解決LR,需要先右單旋轉,再左單旋轉
解決RL,需要先左單旋轉,再右單旋轉
實現左單旋轉

k1,k2
k2的left給k1
k1的right給k2的left
k2給k1的right
實現右單旋轉
k1,k2
k1的right給k2
k2的left給k1的right
k1給k2的left

節點的高度,是它左子樹或者右子樹中,高度大的那個 再加1
/**
* AVL樹測試
* @author taoshihan
* @param <T>
*
*/
public class AVLTree<T extends Comparable<T>> {
private AVLNode mRoot;//根節點
class AVLNode<T extends Comparable<T>>{
private T key;//鍵值
private int height;//高度
private AVLNode left;//左子樹
private AVLNode right;//右子樹
public AVLNode(T key,AVLNode left,AVLNode right) {
this.key=key;
this.left=left;
this.right=right;
this.height=0;
}
}
/**
* 獲取節點高度
* @param tree
* @return
*/
public int height(AVLNode<T> tree){
if(tree!=null){
return tree.height;
}
return 0;
}
/**
* 取出左右子樹中高的那個
* @param a
* @param b
* @return
*/
public int maxHeight(int a,int b){
return a>b ? a : b;
}
/**
* 左單旋轉
* @param k2
* @return
*/
public AVLNode<T> leftLeftRotation(AVLNode<T> k2){
AVLNode k1;
k1 = k2.left;
k2.left=k1.right;
k1.right=k2;
k2.height=maxHeight(height(k2.left), height(k2.right));
k1.height=maxHeight(height(k1.left), height(k1.right));
return k1;
}
/**
* 右單旋轉
* @param k2
* @return
*/
public AVLNode<T> rightRightRotation(AVLNode<T> k1){
AVLNode k2;
k2=k1.right;
k1.right=k2.left;
k2.left=k1;
k2.height=maxHeight(height(k2.left), height(k2.right));
k1.height=maxHeight(height(k1.left), height(k1.right));
return k2;
}