程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> [javaSE] 數據結構(AVL樹基本概念),javaseavl

[javaSE] 數據結構(AVL樹基本概念),javaseavl

編輯:JAVA綜合教程

[javaSE] 數據結構(AVL樹基本概念),javaseavl


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;
    }

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved