數(shù)據(jù)結構-二分搜索樹

二叉樹

定義:二叉樹是最多只有兩個節(jié)點的樹石咬,二叉樹具有唯一根節(jié)點花颗。

二叉樹

二叉樹的特點:

1、二叉樹每個節(jié)點最多有兩個孩子筐骇;

2债鸡、二叉樹每個節(jié)點最多有一個父親。

二分搜索樹

二分搜索樹

二分搜索樹特點:

1铛纬、二分搜索樹的每個節(jié)點的值厌均,大于其左子樹的所有節(jié)點的值;小于其右子樹的所有節(jié)點的值告唆;

2棺弊、每一顆子樹也是二分搜索樹。

源碼分析:

二分搜索樹結構

????首先擒悬,二分搜索樹的泛型必須是實現(xiàn)了 Comparable 的模她,即可以比較的。屬性 Node 有三個變量懂牧,類似于LinkedList侈净。記錄著當前節(jié)點的值,左右節(jié)點僧凤。

向二分搜索樹中添加元素 add(E e):

add

????采用遞歸方式——遞歸的終止條件:最后一步是遞歸到最后一個根元素 NULL畜侦,此時將新節(jié)點放入該位置;遞歸的步驟:這里要根據(jù)當前節(jié)點的值和 e 的大小躯保,來判斷走左右子樹旋膳。然后遞歸函數(shù)add(node.left , e) 或者 add(node.right, e)。

查找元素 contains(E e):

contains

和 add 類似的遞歸操作途事,只是查找元素不需要賦值验懊。

遞歸終止條件:1、走到最后一個節(jié)點 NULL盯孙,還沒找到鲁森;2、找到了元素 E振惰。

遞歸操作:依舊是根據(jù)當前節(jié)點的值和 e 的大小歌溉,來判斷走左右子樹的遞歸。

遍歷二分搜索樹——前序遍歷

前序遍歷

前序遍歷(又稱深度優(yōu)先遍歷骑晶,即會優(yōu)先走完左子樹痛垛,然后往回走):先根節(jié)點,再左右分支桶蛔。

遞歸終止條件:走到最后一個節(jié)點 NULL匙头。

遞歸操作:分別從左右兩邊開始遞歸。

遍歷二分搜索樹——中序遍歷

中序遍歷

中序遍歷:左分支——> 根節(jié)點 ——> 右分支仔雷。

遍歷二分搜索樹——后序遍歷

后序遍歷

后序遍歷:左芬子——> 右分支——> 根節(jié)點蹂析。

遍歷結果分析

只有中序遍歷有明顯的特征舔示,即可以自然排序。

遍歷分析

????每個根節(jié)點都會遍歷三次电抚,圖中 1,2,3 點惕稻。1 點代表該根節(jié)點第一次訪問;2 點代表左子樹走完之后(走到最后一步左 NULL 節(jié)點返回)蝙叛,再次訪問該根節(jié)點俺祠;3 點表示右子樹走完之后(走到最后一步右 NULL 節(jié)點返回),再次訪問該節(jié)點借帘。

????對于前序遍歷來說蜘渣,走到1 點就會輸出;中序遍歷肺然,走到2 點才會輸出蔫缸;后序遍歷,走到 3點才會輸出际起。并且捂龄,遍歷的順序是左子樹到右子樹。

二分搜索樹遍歷執(zhí)行順序

前序遍歷結果:即執(zhí)行1 號點的輸出順序加叁,28 16 13 22 30 29 42倦沧;

中序遍歷結果:即執(zhí)行2 號點的輸出順序,13 16 22 28 30 29 42它匕;

后序遍歷結果:即執(zhí)行3 號點的輸出順序展融,13 22 16 29 42 30 28;

二分搜索樹其他遍歷擴展:

????二分搜索樹的前序遍歷(深度優(yōu)先遍歷)豫柬,非遞歸實現(xiàn):由于前序遍歷的順序是 根節(jié)點——> 左子樹 ——> 右子樹告希,并且輸出是在第一次訪問節(jié)點時。于是可以使用棧烧给,來記錄節(jié)點的訪問順序燕偶,因為棧是后進先出的,于是必須先壓入右節(jié)點再壓入左節(jié)點础嫡。

棧實現(xiàn)前序遍歷

? ? 二分搜索樹的層序遍歷:按層遍歷指么。

層序遍歷


隊列實現(xiàn)層序遍歷

層序遍歷的輸出結果為: 28 16 30 13 22 29 42;

查找二分搜索樹的最大值和最小值:

????思路分析:因為二分搜索樹的左子樹是小于根節(jié)點的榴鼎,右子樹是大于跟節(jié)點的伯诬,于是最小值是在左子樹的最左邊節(jié)點(node.left == null);最大值在右子樹的最右邊那個節(jié)點(node.right == null)巫财。

二分搜索樹最小值
二分搜索樹最大值

刪除二分搜索樹的最小值或者最大值:

????思路分析:刪除最小值時盗似,找到左子樹的最左節(jié)點(最小值節(jié)點,node.left == null)平项,然后讓其上一個節(jié)點的左節(jié)點指向當前最小值節(jié)點的右子樹赫舒,同時刪除最小值節(jié)點(node.right = null)悍及;刪除最大值時,找到右子樹的最右節(jié)點(最大值節(jié)點接癌,node.right == null)并鸵,然后讓其上一個節(jié)點的右節(jié)點指向當前最大值節(jié)點的左子樹,同時刪除最大值節(jié)點(node.left = null)扔涧。

刪除最小值節(jié)點
刪除最大值節(jié)點

刪除二分搜索樹的任意節(jié)點:

????思路分析:當刪除的元素沒有左子樹(node.left == null)或者沒有右子樹(node.right == null),這個邏輯跟刪除最小值和最大值時一樣的届谈;當刪除的元素有左右子樹枯夜,則需要采用后繼或者前驅策略(本案例采用后繼策略,前驅類似)艰山。

后繼:使用比當前需要刪除的元素的值大的且最近的節(jié)點湖雹,替換當前需要刪除的元素,即使用當前需要刪除的節(jié)點的右子樹的最小值曙搬;

前驅:使用比當前需要刪除的元素的值小的且最近的節(jié)點摔吏,替換當前需要刪除的元素,即使用當前需要刪除的節(jié)點的左子樹的最大值纵装;

刪除任意節(jié)點

時間復雜度分析:

對于鏈表結構征讲,add、contains橡娄、remove操作都需要遍歷元素诗箍,即是O(n)的時間復雜度;對于二分搜索樹來說挽唉,如果是滿二叉樹的情況滤祖,上面的操作都是O(h)的時間復雜度,其中 h 為樹的高度瓶籽,并且 h = log n匠童,所以時間復雜度為O(log n);但是如果二叉樹的元素在一邊塑顺,即 h = n汤求,則時間復雜度跟鏈表結構是一樣的,為 O(n)严拒。

二分搜索樹和鏈表結構的時間復雜度分析
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末首昔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子糙俗,更是在濱河造成了極大的恐慌勒奇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巧骚,死亡現(xiàn)場離奇詭異赊颠,居然都是意外死亡格二,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門竣蹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顶猜,“玉大人,你說我怎么就攤上這事痘括〕ふ” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵纲菌,是天一觀的道長挠日。 經(jīng)常有香客問我,道長翰舌,這世上最難降的妖魔是什么嚣潜? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮椅贱,結果婚禮上懂算,老公的妹妹穿的比我還像新娘。我一直安慰自己庇麦,他們只是感情好计技,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著山橄,像睡著了一般酸役。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驾胆,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天涣澡,我揣著相機與錄音,去河邊找鬼丧诺。 笑死入桂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的驳阎。 我是一名探鬼主播抗愁,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呵晚!你這毒婦竟也來了蜘腌?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饵隙,失蹤者是張志新(化名)和其女友劉穎撮珠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體金矛,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡芯急,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年勺届,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娶耍。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡免姿,死狀恐怖,靈堂內的尸體忽然破棺而出榕酒,到底是詐尸還是另有隱情胚膊,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布想鹰,位于F島的核電站紊婉,受9級特大地震影響,放射性物質發(fā)生泄漏杖挣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一刚陡、第九天 我趴在偏房一處隱蔽的房頂上張望惩妇。 院中可真熱鬧,春花似錦筐乳、人聲如沸歌殃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氓皱。三九已至,卻和暖如春勃刨,著一層夾襖步出監(jiān)牢的瞬間波材,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工身隐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廷区,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓贾铝,卻偏偏與公主長得像隙轻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垢揩,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容