資料結構之 二叉搜尋樹 二叉排序樹 BST樹

2021-10-19 07:06:24 字數 3369 閱讀 4745

二叉搜尋樹簡稱bst樹

二叉搜素樹是二叉樹的一種,陣列這種資料結構也能夠實現對元素的快速查詢,但是對於元素的新增、刪除和更新操作,使用陣列來實現的話,就會存在較高的時間複雜度(o(n))級別。對於新增、刪除、查詢操作若是要保持較低的時間複雜度可以採用二叉搜尋樹來實現。

二叉搜尋樹又稱二叉排序樹,其節點之間按照一定的順序進行排放可以極大地提高查詢的效率,由於是樹形結構,其在新增和刪除操作上面的操作不像陣列一樣需要進行元素的複製。

建立乙個bst樹的過程,首先新增的是根部節點,然後新新增的元素就會按照bst樹的特性進行新增,但相對每個新增動作來講,每次新增都是在樹的最底部(葉子節點的層)新增節點。

具有以下特性

新增的元素要符合bst樹的特性,即新增新元素之後依舊是乙個bst樹。

新增步驟

根據要新增的方向為根節點新增新子節點

逐個新增以下元素

新增 9

新增 2

第二次是用 2 和 4 比較

此時 res = -1 並且bst全部遍歷,應該在4 的左邊新增元素

新增 5

繼續遍歷, 使用 5 和 4 進行比較

新增 8

第二次是用 8 和 9 比較

bst樹如下

**實現

這樣結構的二叉樹在查詢元素的時候不需要遍歷整個樹便可以找到元素的位置時間複雜度會降低很多。

@override

public

void

add(e element)

/** * 新增 非根節點

* 1、找到根節點

* 2、對比左右子樹,找到要插入的位置

** res 當前要插入位置的方向

* parent 當前要插入節點的父節點

* */

node

node = rootnode;

node

parent = null;

int res =0;

while

(node != null)

else

if(res <0)

else

} node

newnode =

newnode

<

>

(element, parent)

;/**

* 找到父節點之後, 開始插入元素

*/if(res >0)

else

if(res <0)

size++

;}

對乙個bst樹進行刪除操作的時候要確保刪除節點之後的bst樹依舊是乙個bst樹,即滿足bst樹的特性。此時按照二叉樹的特性可以區分為刪除葉子節點、度為一的節點、度為2的節點三種。

度:當前節點的子樹個數

二叉樹的度: 所有節點中度的最大值

刪除 葉子節點

刪除葉子節點的時候,可以直接刪除,刪除葉子節點不會破壞bst樹的特性。對於上圖的示例來說,刪除 1 、3、5、8、12 這幾個葉子節點不會對bst樹的特性造成損壞。

刪除度為一的節點

刪除度為一的節點,此時這個節點只有乙個子樹,也就是說在當前節點的下面只有乙個直接相連的節點,那麼按照bst的特性來講,如果是右子樹,那麼這個子樹的右子樹上面所有的節點都比要刪除這個節點要大。那麼可以直接把這個子樹的根節點直接去替換要刪除的節點,替換之後的二叉樹依舊還是滿足bst特性的。

刪除的思路

線 一

線 二

刪除度為二的節點

乙個節點的度為2 則是證明該節點擁有左右子節點,要想刪除此節點之後以及保持bst樹的特性,那需要找到乙個合適的節點來替代該節點。而這個替代節點需要滿足:1、該節點的值大於 左子樹所有節點的值, 2、該節點的值小於右子樹所有節點的值。所以替代節點有兩個:1、左子樹中最大的那個節點,2、右子樹中最小的那個節點。找到替代節點之後,直接替代要刪除的節點,然後把替代節點刪除。

前驅或者後繼節點的度是多少呢?

後繼

分為 刪除葉子節點、刪除度為一的節點、刪除度為2節點三種情況,而刪除度為二節點的步驟中要刪除替換節點,這個替換節點的度可能為一,也可能為零,所以整個刪除步驟為: 1、先處理度為二的節點、然後處理度為一的節點、最後處理度為零的節點。

/**

* 刪除節點

* 此時需要分析節點度的大小

** @param node

*/public

void

remove

(node node)

size--

;/**

* 先刪除度為 2 的節點

* 然後在處理度為0 、 1 的節點

*/if(node.

hastwochildren()

)// 開始處理 度為 0 、 1 的節點

// replacement 為null的時候 是 度為 0

node replacement = node.left != null ? node.right : node.right;

if(replacement != null)

else

if(node == node.parent.left)

else

if(node == node.parent.right)

}else

if(node.parent == null)

else

else

}}

資料結構之二叉排序樹

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的節點。以下只建立並先序列印出二叉排序樹 include include...

資料結構之二叉排序樹

二叉排序樹 bst binary sort search tree 對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。特別說明 如果有相同的值,可以將該節點放在左子節點或右子節點 比如針對前面的資料 7,3,10,12,5,1,9 對應的二叉排序樹為...

資料結構之二叉排序樹

別名 二叉搜素樹,二叉查詢樹 線性結構的缺點 順序儲存 不排序 查詢困難,只能通過線性查詢乙個乙個找 排序 刪除和插入操作困難 鏈式結構 無論排序還是不排序,查詢都十分麻煩 注 二叉排序樹 bst 可以解決上述的問題 對於乙個二叉樹中的任意乙個非葉子節點,要求左子節點比當前節點小,右子節點比當前節點...