AVL樹 01 AVL樹基礎(chǔ)

AVL 樹(平衡二叉樹)

  • AVL樹是這樣定義的一棵平衡二叉樹:對(duì)任意節(jié)點(diǎn),左子樹和右子樹的高度差不能超過1势腮;
  • AVL樹中的每個(gè)節(jié)點(diǎn)標(biāo)注了節(jié)點(diǎn)的高度联贩;
  • AVL樹中的每個(gè)節(jié)點(diǎn)都有一個(gè)平衡因子,平衡因子指的是左右子樹的高度差捎拯;

AVLTree 基礎(chǔ)代碼

  • AVLTree的代碼是基于之前BSTMap的代碼改造的泪幌,每個(gè)節(jié)點(diǎn)中key和value,節(jié)點(diǎn)的可比較性體現(xiàn)在key上;
  • 相較于BSTMap祸泪,AVLTree中的節(jié)點(diǎn)擁有表示節(jié)點(diǎn)高度的屬性height吗浩,葉子節(jié)點(diǎn)的高度為1;
import java.util.ArrayList;

public class AVLTree<K extends Comparable<K>, V> {

    private class Node{
        public K key;
        public V value;
        public Node left, right;
        public int height;

        public Node(K key, V value){
            this.key = key;
            this.value = value;
            left = null;
            right = null;
            height = 1;
        }
    }

    private Node root;
    private int size;

    public AVLTree(){
        root = null;
        size = 0;
    }

    public int getSize(){
        return size;
    }

    public boolean isEmpty(){
        return size == 0;
    }   

}

輔助方法 - 獲取節(jié)點(diǎn)的高度值

  • 節(jié)點(diǎn)null的高度為0没隘,對(duì)獲取節(jié)點(diǎn)高度的邏輯進(jìn)行簡(jiǎn)單的封裝懂扼,方便在更復(fù)雜邏輯中的使用 ;
// 獲得節(jié)點(diǎn)node的高度
private int getHeight(Node node){
    if(node == null)
        return 0;
    return node.height;
}

輔助方法 - 獲取節(jié)點(diǎn)的平衡因子

  • 如果節(jié)點(diǎn)是null右蒲,它的平衡因子是0阀湿;
  • 如果節(jié)點(diǎn)不是null,平衡因子的計(jì)算方式為:左孩子的高 - 右孩子的高瑰妄;
private int getBalanceFactor(Node node){
    if(node == null)
        return 0;
    return getHeight(node.left) - getHeight(node.right);
}

add方法相關(guān)的邏輯改動(dòng)

  • 遞歸到底的情況并不需要修改陷嘴,因?yàn)?node == null 的時(shí)候,新創(chuàng)建的節(jié)點(diǎn)只能作為整個(gè)二分搜索樹的葉子節(jié)點(diǎn)翰撑,這是由二分搜索樹的性質(zhì)決定的罩旋,在AVLTree中,葉子節(jié)點(diǎn)的高度就是1眶诈;
  • 遞歸到底的結(jié)果,在原本的二分搜索樹中瓜饥,只需一層層的向上返回逝撬,一層層的鏈接回整個(gè)二分搜索樹,現(xiàn)在在引入節(jié)點(diǎn)的高度值后乓土,將遞歸的結(jié)果一層層的向上返回已經(jīng)不夠了宪潮,因?yàn)樾鹿?jié)點(diǎn)的加入,可能會(huì)影響新加入節(jié)點(diǎn)往上追溯的整個(gè)鏈表中節(jié)點(diǎn)高度值的變化趣苏,所以遞歸到底的結(jié)果在返回上層之后狡相,除了要把根節(jié)點(diǎn)重新鏈入整棵二分搜索樹中之外,還要更新這條鏈表中上層節(jié)點(diǎn)的高度值食磕;具體更新的策略是:左右孩子中尽棕,高度更大的高度值加1;
  • 在更新完節(jié)點(diǎn)(這條鏈表中除新添加的節(jié)點(diǎn))的高度值后彬伦,還要計(jì)算一下節(jié)點(diǎn)的平衡因子滔悉,平衡因子的計(jì)算方式為:左孩子的高 - 右孩子的高;
  • 將遞歸到底的結(jié)果鏈入整個(gè)二分搜索樹单绑,結(jié)算節(jié)點(diǎn)的高度值回官,計(jì)算節(jié)點(diǎn)的平衡因子,這3件事是遞歸到底的結(jié)果在一層層向上返回的過程中搂橙,每一層都需要做的操作歉提;
// 向二分搜索樹中添加新的元素(key, value)
public void add(K key, V value){
    root = add(root, key, value);
}

// 向以node為根的二分搜索樹中插入元素(key, value),遞歸算法
// 返回插入新節(jié)點(diǎn)后二分搜索樹的根
private Node add(Node node, K key, V value){

    if(node == null){
        size ++;
        return new Node(key, value);
    }

    if(key.compareTo(node.key) < 0)
        node.left = add(node.left, key, value);
    else if(key.compareTo(node.key) > 0)
        node.right = add(node.right, key, value);
    else // key.compareTo(node.key) == 0
        node.value = value;

    // 更新height
    node.height = 1 + Math.max(getHeight(node.left), getHeight(node.right));

    // 計(jì)算平衡因子
    int balanceFactor = getBalanceFactor(node);
    if(Math.abs(balanceFactor) > 1)
        System.out.println("unbalanced : " + balanceFactor);

    return node;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苔巨,隨后出現(xiàn)的幾起案子弯屈,更是在濱河造成了極大的恐慌,老刑警劉巖恋拷,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件资厉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蔬顾,警方通過查閱死者的電腦和手機(jī)宴偿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诀豁,“玉大人窄刘,你說我怎么就攤上這事∠鲜ぃ” “怎么了娩践?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烹骨。 經(jīng)常有香客問我翻伺,道長(zhǎng),這世上最難降的妖魔是什么沮焕? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任吨岭,我火速辦了婚禮,結(jié)果婚禮上峦树,老公的妹妹穿的比我還像新娘辣辫。我一直安慰自己,他們只是感情好魁巩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布急灭。 她就那樣靜靜地躺著,像睡著了一般谷遂。 火紅的嫁衣襯著肌膚如雪葬馋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天埋凯,我揣著相機(jī)與錄音点楼,去河邊找鬼。 笑死白对,一個(gè)胖子當(dāng)著我的面吹牛掠廓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甩恼,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蟀瞧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沉颂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悦污,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤铸屉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后切端,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彻坛,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年踏枣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昌屉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茵瀑,死狀恐怖间驮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情马昨,我是刑警寧澤竞帽,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸿捧,受9級(jí)特大地震影響屹篓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笛谦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一抱虐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饥脑,春花似錦、人聲如沸懦冰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刷钢。三九已至笋颤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間内地,已是汗流浹背伴澄。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阱缓,地道東北人非凌。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荆针,于是被迫代替她去往敵國和親敞嗡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颁糟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算喉悴,而且確保經(jīng)過這...
    Winterfell_Z閱讀 5,825評(píng)論 0 13
  • 目錄 1棱貌、什么是樹 2、相關(guān)術(shù)語 3箕肃、二叉樹 3.1婚脱、二叉樹的類型 3.2、二叉樹的性質(zhì) 3.3勺像、二叉樹的結(jié)構(gòu) 3...
    我哈啊哈啊哈閱讀 2,553評(píng)論 0 10
  • AVL定義: AVL的命名是由2個(gè)其發(fā)明者的名字組成的障贸,G.M.Adelson-Velsky和E.M.Landis...
    habit_learning閱讀 852評(píng)論 0 0
  • 一. 很奇怪,我最好的四個(gè)朋友咏删,身上掛著紅紅的帶子惹想,在校門口,面對(duì)面站成四排督函,見到...
    GonBonBonny閱讀 449評(píng)論 0 0
  • 書目:《動(dòng)物農(nóng)場(chǎng)》作者:【英】喬治·奧威爾 今天終于在晚上把這本書讀完了嘀粱,哈,這兩天也有點(diǎn)像打仗似的辰狡,又勞身又費(fèi)腦...
    繡一針閱讀 306評(píng)論 0 1