排序二叉樹(概念性)瞭解一下

基本概念

樹的基本概念,在計算機程序中,樹是從上往下長的,也會有分叉,有個根節點,每個節點可以有一個或多個節點,沒有孩子節點的節點一般稱爲葉子節點。

二叉樹是一棵樹,每個節點最多有兩個孩子節點,一左一右,左邊的稱爲左孩子,右邊的稱爲右孩子。

排序二叉樹,也是二叉樹,它沒有重複元素,而且是有序的二叉樹,對每個節點
如果左子樹不爲空,則左子樹上的所有節點都小於該節點;
如果右子樹不爲空,則右子樹上的所有節點都大於該節點。

在這裏插入圖片描述

基本算法

1.查找

排序二叉樹有一個很好的優點,在其中查找一個元素時很方便,也很高校,基本步驟爲:
(1) 首先與根節點比較,如果相同,就找到了;
(2) 如果小於根節點,則到左子樹中遞歸查找;
(3)如果大於根節點,則到右子樹中遞歸查找。
此外,在排序二叉樹中,可以方便地查找最小值和最大值。最小值即爲最左邊的節點,從根節點一路查找左孩子即可;最大值即爲最右邊的節點,從根節點一路查找右孩子即可。

2.遍歷

排序二叉樹也可以方便地按序遍歷。用遞歸的方式,用如下算法即可按序遍歷:
(1)訪問左子樹;
(2)訪問當前節點;
(3)訪問右子樹

從根節點開始,但先訪問根節點的左子樹,一直到最左邊的節點,所以第一個訪問的是1,1沒有右子樹,返回上一層,訪問3,然後訪問3的右子樹,4沒有左子樹,所以訪問4,然後是4的右子樹6,以此類推,訪問順序是有序的:1,3,4,6,7,8,9.
在這裏插入圖片描述
不用遞歸的方式,也可以實現按序遍歷,第一個節點爲最左邊的節點,從第一個節點開始,依次找後繼節點,找其後繼節點算法爲:
(1) 如果有右孩子,則後繼節點爲右子樹中最小的節點。
(2)如果沒有右孩子,後繼節點爲父節點或某個祖先節點,從當前節點往上找,如果它是父節點的右孩子,則繼續找父節點,直到它不是右孩子或父節點爲空,則第一個非右孩子節點的父節點就是後繼節點,如果父節點爲空,則後繼節點爲null。
文字描述比較抽象,看圖說話:
在這裏插入圖片描述

詳細解釋:黃色線表示後繼節點
(1)第一個節點1沒有右孩子,它不是父節點的右孩子,所以它的後繼節點就是其父節點3;
(2)3有右孩子,右子樹中只有一個節點6,所以3的後繼節點爲4;
(3)4有右孩子,右子樹中只有一個節點6,所以4的後繼節點爲6;
(4)6沒有右孩子,往上找父節點,它是父節點4的右孩子,4又是父節點3的右孩子,3不是父節點7的右孩子,所以6的後繼節點爲3的父節點7;
(5)7有右孩子,右子樹中最小值是8.所以7的後繼節點爲8;
(6)8沒有右孩子,往上找父節點,它不是父節點9的右孩子,所以它的後繼節點就是其父節點9;
(7)9沒有右孩子,往上找父節點,它是父節點7的右孩子,接着往上找,但7已經是根節點,父節點爲空,則後繼爲null。

3.插入

在排序二叉樹中,插入元素首先要找插入位置,即新節點的父節點,怎麼找呢?與查找元素類似,從根節點開始往下找,其步驟爲:
(1) 與當前節點比較,如果相同,表示已經存在了,不能再插入;
(2) 如果小於當前節點,則到左子樹中尋找,如果左子樹爲空,則當前節點即爲要找的父節點;
(3) 如果大於當前節點,則到右子樹中尋找,如果右子樹爲空,則到當前節點即爲要找的父節點。
找到父節點後,即可插入,如果插入元素小於父節點,則作爲左孩子插入,否則作爲右孩子插入。

我們看個例子,依次插入7,3,4,1,9,6,8的過程
在這裏插入圖片描述

4.刪除

從排序二叉樹中刪除一個節點要複雜一些,有三種情況:
(1)節點爲葉子節點;
(2)節點只有一個孩子節點;
(3)節點有兩個孩子節點。

如果節點爲葉子節點,則很簡單,可以直接刪掉,修改父節點的對應孩子節點爲空即可。

如果節點只有一個孩子節點,則替換待刪節點爲孩子節點,或者說,在孩子節點和父節點直接建立鏈接。
在這裏插入圖片描述

如果節點有兩個孩子節點,則首先找該節點的後繼節點,找到後繼節點後,替換待刪節點爲後繼節點的內容,然後再刪除後繼節點,後繼節點沒有左孩子,這就將兩個孩子節點的情況轉換爲葉子節點或只有一個孩子節點的情況。
在這裏插入圖片描述

平衡的排序二叉樹

從前面的描述中可以看出,排序二叉樹的形狀與插入和刪除的順序密切相關,極端情況下,排序二叉樹可能退化爲一個鏈表。比如,如果插入順序爲1, 3,4,6,,7,9
在這裏插入圖片描述

平衡具體定義是什麼呢?
有一種高度平衡的定義,即任何節點的左右子樹的高度差最多爲一,滿足這個平衡定義的排序二叉樹又被稱爲AVL,在他們算法中,在插入和刪除節點時,通過一次或多次旋轉操作來重新平衡樹。
在TreeMap的實現中,用的並不是AVL樹,而是紅黑樹,紅黑樹也是插入和刪除節點時通過旋轉操作來平衡的,但它並不是高度平衡,而是大致平衡,是指,它確保任意一條從根到葉子節點的路徑,沒有任何一條路徑的長度會比其他路徑長過兩倍。紅黑樹減弱了平衡的要求,但降低了保持平衡需要的開銷。在實際應用中,統計性能高於AVL樹。

爲什麼叫紅黑樹呢?因爲它對每個節點進行着色,顏色或黑或紅,並對節點的着色有一些約束,滿足這個約束即可以確保樹是大致平衡的。大致平衡的目的是爲了保證樹的查找效率。

與哈希表一樣,樹也是計算機程序中的一種重要的數據結構和思維方式,爲了能夠快速操作數據,哈希和樹是兩種基本的思維方式,不需要順序,優先來考慮哈希,需要順序,考慮樹,除了容器類TreeMap/TreeSet,數據庫中的索引結構也是基於樹的(不過基於B樹,而不是二叉樹),而索引是能夠在大量數據中快速訪問數據的關鍵。

參考文章

java編程的邏輯基礎(馬俊昌)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章