平衡二叉樹

查找樹

平衡二叉樹先是一顆查找樹噪伊,所以先從查找樹的性質(zhì)講起簿煌。

查找樹的遞歸定義是氮唯,每個(gè)節(jié)點(diǎn)的左孩子值不大于它、右孩子不小于它姨伟,由此構(gòu)成的二叉樹即為查找樹惩琉。據(jù)此性質(zhì),在插入或查找時(shí)夺荒,從根節(jié)點(diǎn)向下逐一比較瞒渠,即可找到相應(yīng)的插入或查找的位置。

查找樹


在極端情況下技扼,比如連續(xù)插入依次遞增或遞減的節(jié)點(diǎn)伍玖,查找樹將退化成鏈表,復(fù)雜度從o(lgn)退化成o(n)剿吻,為避免這種情況窍箍,我們需要在查找樹的基礎(chǔ)上加上限制條件…

退化成鏈表的情況

平衡二叉樹

平衡二叉樹有多種,只因各自的限制條件不盡相同丽旅,這里只講AVL樹椰棘。

對(duì)AVL樹而言,每個(gè)節(jié)點(diǎn)左右孩子的樹高差不超過1榄笙,否則需要旋轉(zhuǎn)樹達(dá)到平衡邪狞。

平衡二叉樹

在假定除根節(jié)點(diǎn)外的每個(gè)節(jié)點(diǎn)都達(dá)到平衡的情況下,該樹只有四種不平衡的狀態(tài):

i.左子樹比右子樹高(默認(rèn)都是高2個(gè)單位以上的办斑,下同)外恕,且左子樹的左樹高

ii.右子樹比左子樹高杆逗,且右子樹的右樹高

iii.左子樹比右子樹高乡翅,且左子樹的右樹高

iv.右子樹比左子樹高,且右子樹的左樹高

平衡操作

我們分情況討論运敢,并使樹重新達(dá)到平衡均抽。

i.右旋

情況1

對(duì)于情況1饼灿,我們僅僅需要一次右旋操作即可,大家可以把樹想得十分柔軟靶累,在重力的作用下自然下垂,然后我們把B節(jié)點(diǎn)用力提起癣疟,這棵樹就成了下圖的樣子…

右旋后

ii.左旋

情況2

情況2與情況1是對(duì)稱的挣柬,進(jìn)行的操作也類似,只需一次左旋操作即可使樹重新達(dá)到平衡睛挚。

左旋后

iii.左右雙旋

情況3

情況3比前面兩種略微復(fù)雜邪蛔,需要兩次旋轉(zhuǎn)操作才能使樹重新達(dá)到平衡。我們先將目光移到A節(jié)點(diǎn)的左樹扎狱,然后以該子樹為基礎(chǔ)做左旋操作侧到,如情況2所示勃教,于是我們得到下圖,

左子樹左旋

由于根節(jié)點(diǎn)左子樹本來就是平衡的匠抗,所以左旋之后依然平衡故源,不過此時(shí)左子樹的左樹已經(jīng)比右樹高了,于是我們將情況3轉(zhuǎn)化成了情況1汞贸,再對(duì)整顆樹做一次右旋操作即可绳军。

整樹右旋

iv.右左雙旋

情況4

情況4與情況3對(duì)稱,也是先通過右旋將情況4轉(zhuǎn)換成情況2著蛙,再左旋重新達(dá)到平衡删铃,所以不再贅述。

插入

如果樹不存在節(jié)點(diǎn)踏堡,那么新節(jié)點(diǎn)為根節(jié)點(diǎn)猎唁,否則依照查找樹的性質(zhì)從根節(jié)點(diǎn)開始向下比較,直至到達(dá)末尾節(jié)點(diǎn)顷蟆,此時(shí)新節(jié)點(diǎn)作為樹的葉子節(jié)點(diǎn)诫隅,然后從新節(jié)點(diǎn)開始向上回溯,平衡每個(gè)回溯的節(jié)點(diǎn)帐偎,直到將整顆樹平衡逐纬。插入前的樹是平衡的,易證每個(gè)回溯節(jié)點(diǎn)的左右子樹都是平衡的削樊,參考上節(jié)平衡二叉樹的四種基本情況即可平衡回溯節(jié)點(diǎn)豁生,從而當(dāng)回溯到根節(jié)點(diǎn)時(shí),我們即可平衡整顆二叉樹漫贞。

刪除

在刪除之前甸箱,我們需要依照查找樹的性質(zhì)定位到刪除節(jié)點(diǎn),即查找操作迅脐,找到刪除節(jié)點(diǎn)后芍殖,如果為葉子節(jié)點(diǎn),直接刪除谴蔑,否則從左子樹或者右子樹中選擇一個(gè)替換節(jié)點(diǎn)豌骏,替代刪除節(jié)點(diǎn)的位置,一般選擇樹高最大的那顆隐锭。如果是左子樹窃躲,那么尋找子樹值最大的節(jié)點(diǎn),否則尋找右子樹最小的節(jié)點(diǎn)作為替換節(jié)點(diǎn)钦睡,這是為了避免破壞查找樹的性質(zhì)而做出的必然選擇蒂窒。值得一提的是,在取下替換節(jié)點(diǎn)時(shí),如果替換節(jié)點(diǎn)存在子樹刘绣,這顆子樹的根節(jié)點(diǎn)應(yīng)當(dāng)替代替換節(jié)點(diǎn)的位置樱溉。

我們使用替換節(jié)點(diǎn)替換刪除節(jié)點(diǎn)的位置后,就應(yīng)該從替換節(jié)點(diǎn)(替換節(jié)點(diǎn)原來的父節(jié)點(diǎn))的父節(jié)點(diǎn)開始平衡二叉樹了纬凤。與插入時(shí)平衡二叉樹類似福贞,由于刪除之前就是平衡的,所以向上回溯時(shí)節(jié)點(diǎn)的子樹都是平衡的停士,最后回溯至根節(jié)點(diǎn)挖帘,我們即可重新平衡整顆二叉樹。

參考資料

為了解平衡二叉樹恋技,我從網(wǎng)上參考了一些事例拇舀,感覺說的不是很清楚,幾乎都只是擺出了針對(duì)四種情況的旋轉(zhuǎn)操作蜻底,并沒有指出它們和插入刪除之間的聯(lián)系骄崩,讓人覺得很迷惑,最后在家翻看了之前的教材(清華大學(xué)出版的《數(shù)據(jù)結(jié)構(gòu)》)才明白了一點(diǎn)薄辅,那個(gè)將樹提起來的想法就是參考這本書的描述要拂,我覺得非常形象易懂…最后給出我實(shí)現(xiàn)此樹的源碼:

http://download.csdn.net/detail/u012129163/9885262??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市站楚,隨后出現(xiàn)的幾起案子脱惰,更是在濱河造成了極大的恐慌,老刑警劉巖窿春,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異旧乞,居然都是意外死亡蔚润,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門良蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抽碌,“玉大人悍赢,你說我怎么就攤上這事决瞳。” “怎么了左权?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵皮胡,是天一觀的道長。 經(jīng)常有香客問我赏迟,道長屡贺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮甩栈,結(jié)果婚禮上泻仙,老公的妹妹穿的比我還像新娘。我一直安慰自己量没,他們只是感情好玉转,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著究抓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袭灯。 梳的紋絲不亂的頭發(fā)上刺下,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音稽荧,去河邊找鬼橘茉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姨丈,可吹牛的內(nèi)容都是我干的捺癞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼构挤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼髓介!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筋现,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤唐础,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矾飞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一膨,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年洒沦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豹绪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡申眼,死狀恐怖瞒津,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情括尸,我是刑警寧澤巷蚪,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站濒翻,受9級(jí)特大地震影響屁柏,放射性物質(zhì)發(fā)生泄漏啦膜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一淌喻、第九天 我趴在偏房一處隱蔽的房頂上張望僧家。 院中可真熱鬧,春花似錦裸删、人聲如沸啸臀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘粒。三九已至,卻和暖如春伤塌,著一層夾襖步出監(jiān)牢的瞬間灯萍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工每聪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旦棉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓药薯,卻偏偏與公主長得像绑洛,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子童本,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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