一、二叉查詢樹
二叉查詢樹,對於每個結點n,n的左子樹中包含的元素都小於n中的元素,n的右子樹中包含的元素都大於等於n中的元素,即左子樹上的元素小於父結點的值,而右子樹上的元素大於等於父結點的值。如下圖所示。根結點的左子樹每個元素都小於80,右子樹每個元素都大於80.
查詢方法,要判定乙個具體的目標是否存在於樹中,需要沿著從根開始的路徑,根據查詢目標是小於還是大於當前結點的值,相應地轉到當前結點的左子結點或右結點。最終或是找到目標元素,或是遇到路徑的末端,後者意味著目標不在樹中。
在二叉查詢樹中新增元素,改過程類似於樹的查詢過程,新元素新增為樹的葉結點,從根開始,沿著每個結點中元素所確定的路徑,直到相應地方向上沒有子結點為止,此時,將新元素新增為葉結點。
如果沒有其他操作,二叉查詢樹的樹形由元素的新增順序來決定。注:如果輸入是完全有序的,二叉查詢樹就會退化為乙個有序鍊錶,削弱了它本身的價值,如下圖所示。
在二叉查詢樹中刪除元素,要考慮如下三種情況(參考下圖):
當從二叉查詢樹中刪除有兩個子結點的結點是,比較好的辦法是用它的中序後繼來取代它,即在中序遍歷中排在被刪元素之後的那個元素(緊鄰的下乙個值)二、平衡二叉查詢樹
在平衡二叉樹中進行查詢,比在退化的樹中進行查詢的效率高很多。在有n個結點的平衡樹中進行查詢及新增操作的效率是進行o(log2 n)次比較(最長路徑的長度)。樹越退化,查詢及新增操作的時間複雜度越接近o(n),它抵消了使用查詢樹帶來的益處。
可以對二叉查詢樹進行旋轉以恢復平衡右旋轉
右旋轉
並非所有的不平衡情況都可以用乙個單一的旋轉解決,如果不平衡性是由根的右子結點的左子樹的長路徑引發的,則必須先繞那個異常子樹執行一次右旋轉,然後再繞根執行一次左旋轉(右-左旋轉)。如果不平衡是由根的左子結點的右子樹中的長路徑引發,則執行(左-右旋轉)詳情見我的實驗部落格
(statistics.sh指令碼的執行結果截圖)
暫未給出答案
我會像奧德休斯一樣, 朝著心中的方向 ,哪怕眾神會在彼岸阻擋 。當我需要獨自站在 ,遠方的沙場 ,**就是我緊握的夢想 ,而我受過的傷 ,都是我的勳章 。繼續加油!
**行數(新增/累積)
部落格量(新增/累積)
學習時間(新增/累積)
重要成長
目標5000行
400小時
第一周188
1/125
演算法分析
第二週70/258
1/215/40
《構建之法》7-9章
第三週474/732
1/320/60
查詢和排序
第四五六周
1313/2045
4/712/72
棧和佇列
第七周890/2935
1/814/86
樹第八周
913/3848
1/920/106
二叉查詢樹
第九周(有空多看看現代軟體工程 課件 軟體工程師能力自我評價表)
20162320劉先潤大二第7周學習總結
一.樹 樹是非線性結構,其中的元素組織為乙個結構層次。而之前的集合 棧 佇列及鍊錶 都是線性資料結構,即他們的元素可以乙個接乙個排列。樹 tree 是有一組邊 edge 夠構成,結點用來儲存元素,邊表示結點之間的連線。如下圖所示,書中較低一層的結點稱為其前一層結點的子節點 children 乙個結點...
20162320劉先潤大二第6周學習總結
佇列元素按fifo的方式處理 最先進入的元素最先離開 佇列是儲存重複編碼k值的一種有效結構。實現模擬時常用佇列來表示等待的一列 教材實現方法 首先建立customer類,記錄了顧客到達的時間及買完票後離開的時間,離開時間減去到達時間就是顧客買票所花費總時間,然後ticketcounter模擬這個場景...
20162320劉先潤大二第3周學習總結
線性查詢,從一端開始以線性的方式掃瞄找池。下圖是我繪製的乙個說明圖 二分查詢,借助查詢池中資料的有序性,每次從中間開始查詢,即每次比較都會將物件的範圍縮小一倍,排除了一半的可行候選資料。選擇排序 反覆地將乙個個具體的值放到它最終的有序位置,從而完成一組值的排序。我的理解 每一次從將要排序的資料中選出...