二叉排序樹及相關(guān)操作說明

在講到集合的時候,很容易讓人想到的是數(shù)組和鏈表孟岛。然后大家會討論這兩種數(shù)據(jù)結(jié)構(gòu)的差異似将。但是根據(jù)指定的內(nèi)容在集合中查找,這兩種數(shù)據(jù)結(jié)構(gòu)的性能卻沒有區(qū)別都是O(n)蚀苛,如何提高在集合中檢索指定內(nèi)容數(shù)據(jù)的性能在验,是我們在程序開發(fā)中面臨的問題。

二叉排序樹

二叉排序樹的性質(zhì)

  1. 左子樹不空時堵未,左子樹上所有的結(jié)點(diǎn)關(guān)鍵字的值均小于根結(jié)點(diǎn)關(guān)鍵字的值腋舌;
  2. 右子樹不空時,右子樹上所有的結(jié)點(diǎn)關(guān)鍵字的值均大于根結(jié)點(diǎn)關(guān)鍵字的值渗蟹;
  3. 左右子樹同時有滿足性質(zhì)1块饺、性質(zhì)2

二叉樹的查找

  1. 將給定的值與根結(jié)點(diǎn)相比較,若相等則查找成功雌芽;
  2. 若小于根結(jié)點(diǎn)到左子樹進(jìn)行查找授艰,若大于根結(jié)點(diǎn)到右子樹進(jìn)行查找;
  3. 左右子樹依次進(jìn)行步驟1世落、步驟2操作淮腾,直到找到相等的結(jié)點(diǎn)或找到null(查找失敗)
  4. 二叉樹的查找與折半查找相似

二叉樹的操作

插入

例,根據(jù){45,53,45,12,24,90}來構(gòu)建二叉排序樹
BSTInsert.png
  1. 從一個空樹出發(fā)來構(gòu)建二叉排序樹屉佳,新增結(jié)點(diǎn)是建立在查找二叉排序樹失敗的前提下谷朝,因此新增的結(jié)點(diǎn)一定是二叉排序樹的葉子結(jié)點(diǎn)
  2. 中序遍歷二叉排序樹即可得到一個有序的集合

刪除

二叉排序樹的刪除規(guī)則:設(shè),
*f為指向被刪除結(jié)點(diǎn)的雙親結(jié)點(diǎn)的指針
*p為指向被刪除結(jié)點(diǎn)的指針

  1. 若*p是葉子結(jié)點(diǎn)武花,那么就直接刪除
    • *p是*f的左子結(jié)點(diǎn)圆凰,如圖所示:
      *p左葉子節(jié)點(diǎn)
    • *p是*f的右子結(jié)點(diǎn),如圖所示:
      *p節(jié)點(diǎn)是右葉子節(jié)點(diǎn)
  2. 若刪除的*p結(jié)點(diǎn)只有左子樹或是右子樹体箕,刪除*p結(jié)點(diǎn)之后直接將子樹掛在*f結(jié)點(diǎn)上即可专钉,成為*f結(jié)點(diǎn)的子樹
    • *p是*f的左子結(jié)點(diǎn)挑童,如圖所示:
      *p節(jié)點(diǎn)有右子節(jié)點(diǎn)
    • *p是*f的右子結(jié)點(diǎn),如圖所示:
      *p節(jié)點(diǎn)有左孩子節(jié)點(diǎn)
    • 說明:上述只是部分情況跃须,剩余情況最后都跟上圖顯示的刪除*p結(jié)點(diǎn)之后的結(jié)點(diǎn)情況一致炮沐。
  3. 若刪除的*p結(jié)點(diǎn)同時擁有左、右子樹回怜,刪除節(jié)點(diǎn)有兩種可行性操作:
    • 若*p結(jié)點(diǎn)是*f的左子結(jié)點(diǎn)
      • 第一種操作:將*p點(diǎn)的左子樹PL直接掛載到*f結(jié)點(diǎn)上大年,成為*f結(jié)點(diǎn)的左子樹,然后將*p結(jié)點(diǎn)的右子樹PR掛載到中序遍歷時PL子樹中*p結(jié)點(diǎn)的直接前驅(qū)節(jié)點(diǎn)玉雾,成為該節(jié)點(diǎn)的右子樹翔试;如圖所示:
        *p節(jié)點(diǎn)是*f的左孩子且同時擁有左右子樹
      • 第二種操作:使用二叉排序樹的中序遍歷得到的結(jié)點(diǎn)順序,確定*p結(jié)點(diǎn)的直接前驅(qū)或直接后繼結(jié)點(diǎn)复旬,將該結(jié)點(diǎn)移到*p結(jié)點(diǎn)位置
        • 該結(jié)點(diǎn)滿足以下特性:
          1. 該結(jié)點(diǎn)是葉子結(jié)點(diǎn)或只有一個子樹(若是前驅(qū)節(jié)點(diǎn)只有左子樹垦缅;若是后繼節(jié)點(diǎn)只有右子樹)
          2. 該結(jié)點(diǎn)是*p前驅(qū)結(jié)點(diǎn)的話,就是該前驅(qū)結(jié)點(diǎn)父節(jié)點(diǎn)的右子結(jié)點(diǎn)驹碍;
          3. 該結(jié)點(diǎn)是*p后繼結(jié)點(diǎn)的話壁涎,就是該后繼結(jié)點(diǎn)父節(jié)點(diǎn)的左子結(jié)點(diǎn)。
        • 接下來以*p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)進(jìn)行討論:
          • 若*p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)是葉子結(jié)點(diǎn)則直接移動即可志秃,圖就略過了怔球。
          • 若*p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)有左子樹的話,則將左子樹掛載到*p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的父結(jié)點(diǎn)上浮还,成為*p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的父結(jié)點(diǎn)的右子樹竟坛,如圖所示:
            *p節(jié)點(diǎn)是*f的左孩子且同時擁有左右子樹
        • 接下來以*p結(jié)點(diǎn)的后繼結(jié)點(diǎn)進(jìn)行討論:
          • 若*p結(jié)點(diǎn)的后繼結(jié)點(diǎn)是葉子結(jié)點(diǎn)則直接移動即可,圖(略)
          • 若*p結(jié)點(diǎn)的后繼結(jié)點(diǎn)有右子樹的話钧舌,則將右子樹掛載到*p結(jié)點(diǎn)的后繼結(jié)點(diǎn)的父結(jié)點(diǎn)上担汤,成為*p結(jié)點(diǎn)的后繼結(jié)點(diǎn)的父結(jié)點(diǎn)的左子樹,如圖所示:
            *p節(jié)點(diǎn)是*f節(jié)點(diǎn)的左子樹同時擁有左右子樹
        • 上述是在*p是*f的孩子的前提下進(jìn)行的討論洼冻,接下來是以*p是*f的孩子進(jìn)行討論崭歧,直接上圖了
          • 第一種操作:
            *p節(jié)點(diǎn)是*f節(jié)點(diǎn)的右孩子同時擁有左右子節(jié)點(diǎn)
          • 第二種轉(zhuǎn)換:
            • 以*p結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)進(jìn)行討論
              *p節(jié)點(diǎn)是*f節(jié)點(diǎn)右孩子同時擁有左右子節(jié)點(diǎn)
            • 以*p結(jié)點(diǎn)的后繼結(jié)點(diǎn)進(jìn)行討論
              *p節(jié)點(diǎn)是*f節(jié)點(diǎn)右孩子同時擁有左右子節(jié)點(diǎn)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撞牢,隨后出現(xiàn)的幾起案子率碾,更是在濱河造成了極大的恐慌,老刑警劉巖普泡,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件播掷,死亡現(xiàn)場離奇詭異审编,居然都是意外死亡撼班,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門垒酬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砰嘁,“玉大人件炉,你說我怎么就攤上這事“妫” “怎么了斟冕?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缅阳。 經(jīng)常有香客問我磕蛇,道長,這世上最難降的妖魔是什么十办? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任秀撇,我火速辦了婚禮,結(jié)果婚禮上向族,老公的妹妹穿的比我還像新娘呵燕。我一直安慰自己,他們只是感情好件相,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布再扭。 她就那樣靜靜地躺著,像睡著了一般夜矗。 火紅的嫁衣襯著肌膚如雪泛范。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天紊撕,我揣著相機(jī)與錄音敦跌,去河邊找鬼。 笑死逛揩,一個胖子當(dāng)著我的面吹牛柠傍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辩稽,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼惧笛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逞泄?” 一聲冷哼從身側(cè)響起患整,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喷众,沒想到半個月后各谚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡到千,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年昌渤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憔四。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡膀息,死狀恐怖般眉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潜支,我是刑警寧澤甸赃,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站冗酿,受9級特大地震影響埠对,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裁替,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一鸠窗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胯究,春花似錦稍计、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剥哑,卻和暖如春硅则,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背株婴。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工怎虫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人困介。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓大审,卻偏偏與公主長得像,于是被迫代替她去往敵國和親座哩。 傳聞我的和親對象是個殘疾皇子徒扶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

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

  • 目錄 0.樹0.1 一般樹的定義0.2 二叉樹的定義 1.查找樹ADT 2.查找樹的實(shí)現(xiàn)2.1 二叉查找樹2.2 ...
    王偵閱讀 7,249評論 0 3
  • 四姜骡、樹與二叉樹 1. 二叉樹的順序存儲結(jié)構(gòu) 二叉樹的順序存儲就是用數(shù)組存儲二叉樹。二叉樹的每個結(jié)點(diǎn)在順序存儲中都有...
    MinoyJet閱讀 1,549評論 0 7
  • 二叉樹 二叉樹是每個節(jié)點(diǎn)最多有兩個子樹的樹結(jié)構(gòu)屿良。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(...
    n油炸小朋友閱讀 782評論 0 1
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)圈澈,樹與前面介紹的線性表,棧尘惧,隊(duì)列等線性結(jié)構(gòu)不同康栈,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,462評論 1 31
  • 一、 概念 二叉樹按照先序、中序谅将、后續(xù)遍歷的方法形成一個線性序列后漾狼,每個結(jié)點(diǎn)(除第一個和最后一個外)重慢,都有且僅有一...
    Qi0907閱讀 1,461評論 0 1