计算机考研8,计算机考研每日一练:第八天
平衡二叉樹實(shí)現(xiàn)原理
平衡二叉樹構(gòu)建的基本思想就是在構(gòu)建二叉排序樹的過程中,每當(dāng)插入一個(gè)結(jié)點(diǎn)時(shí),先檢查是否因插入而破壞了樹的平衡性,若是,則找出最小不平衡子樹。在保持二叉排序樹特性的前提下,調(diào)整最小不平衡子樹中各結(jié)點(diǎn)之間的鏈接關(guān)系,進(jìn)行相應(yīng)的旋轉(zhuǎn),使之成為新的平衡子樹。 下面講解一個(gè)平衡二叉樹構(gòu)建過程的例子。現(xiàn)在又a[10] = {3, 2, 1, 4, 5, 6, 7, 10, 9, 8}需要構(gòu)建二叉排序樹。在沒有學(xué)習(xí)平衡二叉樹之前,根據(jù)二叉排序樹的特性,通常會(huì)將它構(gòu)建成如下左圖。雖然完全符合二叉排序樹的定義,但是對(duì)這樣高度達(dá)到8的二叉樹來說,查找是非常不利的。因此,更加期望構(gòu)建出如下右圖的樣子,高度為4的二叉排序樹,這樣才可以提供高效的查找效率。
現(xiàn)在來看看如何將一個(gè)數(shù)組構(gòu)成出如上右圖的樹結(jié)構(gòu)。 對(duì)于數(shù)組a的前兩位3和2,很正常地構(gòu)建,到了第個(gè)數(shù)“1”時(shí),發(fā)現(xiàn)此時(shí)根結(jié)點(diǎn)“3”的平衡因子變成了2,此時(shí)整棵樹都成了最小不平衡子樹,需要進(jìn)行調(diào)整,如下圖圖1(結(jié)點(diǎn)左上角數(shù)字為平衡因子BF值)。因?yàn)锽F為正,因此將整個(gè)樹進(jìn)行右旋(順時(shí)針),此時(shí)結(jié)點(diǎn)2成了根結(jié)點(diǎn),3成了2的右孩子,這樣三個(gè)結(jié)點(diǎn)的BF值均為0,非常的平衡,如下圖圖2所示。
然后再增加結(jié)點(diǎn)4,平衡因子沒有改變,如上圖圖3。增加結(jié)點(diǎn)5時(shí),結(jié)點(diǎn)3的BF值為-2,說明要旋轉(zhuǎn)了。由于BF是負(fù)值,對(duì)這棵最小平衡子樹進(jìn)行左旋(逆時(shí)針旋轉(zhuǎn)),如下圖圖4,此時(shí)整個(gè)樹又達(dá)到了平衡。
繼續(xù)增加結(jié)點(diǎn)6時(shí),發(fā)現(xiàn)根結(jié)點(diǎn)2的BF值變成了-2,如下圖圖6所示。所以對(duì)根結(jié)點(diǎn)進(jìn)行了左旋,注意此時(shí)本來結(jié)點(diǎn)3是結(jié)點(diǎn)3的左孩子,由于旋轉(zhuǎn)后需要滿足二叉排序樹特性,因此它成了結(jié)點(diǎn)2的右孩子,如圖7所示。
增加結(jié)點(diǎn)7,同樣的左旋轉(zhuǎn),使得整棵樹達(dá)到平衡,如下圖8和9所示。
當(dāng)增加結(jié)點(diǎn)10時(shí),結(jié)構(gòu)無變化,如圖10所示。再增加結(jié)點(diǎn)9,此時(shí)結(jié)點(diǎn)7的BF變成了-2,理論上只需要旋轉(zhuǎn)最小不平衡樹7、9、10即可,但是,如果左旋轉(zhuǎn)后,結(jié)點(diǎn)9變成了10的右孩子,這是不符合二叉排序樹的特性的,此時(shí)不能簡單的左旋。如圖11所示。
仔細(xì)觀察圖11,發(fā)現(xiàn)根本原因在于結(jié)點(diǎn)7的BF是-2,而結(jié)點(diǎn)10的BF是1,也就是說,它們兩個(gè)一正一負(fù),符號(hào)并不統(tǒng)一,而前面的幾次旋轉(zhuǎn),無論左還是右旋,最小不平衡子樹的根結(jié)點(diǎn)與它的子結(jié)點(diǎn)符號(hào)都是相同的。這就是不能直接旋轉(zhuǎn)的關(guān)鍵。 不統(tǒng)一,不統(tǒng)一就把它們先轉(zhuǎn)到符號(hào)統(tǒng)一再說,于是先對(duì)結(jié)點(diǎn)9和結(jié)點(diǎn)10進(jìn)行右旋,使得結(jié)點(diǎn)10成了9的右子樹,結(jié)點(diǎn)9的BF為-1,此時(shí)就與結(jié)點(diǎn)7的BF值符號(hào)統(tǒng)一了,如圖12所示。
這樣再以結(jié)點(diǎn)7為最小不平衡子樹進(jìn)行左旋,得到如下圖13。接著,插入8,情況與剛才類似,結(jié)點(diǎn)6的BF是-2,而它的右孩子9的BF是1,如圖14,因此首先以9為根結(jié)點(diǎn),進(jìn)行右旋,得到圖15,此時(shí)結(jié)點(diǎn)6和結(jié)點(diǎn)7的符號(hào)都是負(fù),再以6為根結(jié)點(diǎn)左旋,最終得到最后的平衡二叉樹,如圖16所示。
通過這個(gè)例子,可以發(fā)現(xiàn),當(dāng)最小不平衡樹根結(jié)點(diǎn)的平衡因子BF是大于1時(shí),就右旋,小于-1時(shí)就左旋,如上例中的結(jié)點(diǎn)1、5、6、7的插入等。插入結(jié)點(diǎn)后,最小不平衡子樹的BF與它的子樹的BF符號(hào)相反時(shí),就需要對(duì)結(jié)點(diǎn)先進(jìn)行一次旋轉(zhuǎn)以使得符號(hào)相同后,再反向旋轉(zhuǎn)一次才能夠完成平衡操作,如上例中結(jié)點(diǎn)9、8的插入時(shí)。
總結(jié)
以上是生活随笔為你收集整理的计算机考研8,计算机考研每日一练:第八天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用宝塔本地搭建php,Windows系统
- 下一篇: java带权连通图上最小权边,连通图最小