二叉查詢樹 BST

2021-07-04 05:14:09 字數 1381 閱讀 1341

當所有的靜態查詢結構新增和刪除乙個資料的時候,整個結構都需要重建。這對於常常需要在查詢過程中動態改變資料而言,是災難性的。因此人們就必須去尋找高效的動態查詢結構,我們在這討論乙個非常常用的動態查詢樹——二叉查詢樹

二叉查詢樹的特點

下面的圖就是兩棵二叉查詢樹,我們可以總結一下他的特點:

(1) 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值

(2) 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值

(3) 它的左、右子樹也分別為二叉查詢樹

我們中序遍歷這兩棵樹發現乙個有序的資料序列: 【1  2  3  4  5  6  7  8 】

二叉查詢樹的操作

插入操作:

現在我們要查詢乙個數9,如果不存在則,新增進a圖。我們看看二叉查詢樹動態新增的過程:

1). 數9和根節點4比較(9>4),則9放在節點4的右子樹中。

2). 接著,9和節點5比較(9>5),則9放在節點5的右子樹中。

3). 依次類推:直到9和節點8比較(9>8),則9放在節點8的右子樹中,成為節點8的右孩子。

這個過程我們能夠發現,動態新增任何乙個資料,都會加在原樹結構的葉子節點上,而不會重新建樹。 由此可見,動態查詢結構確實在這方面有巨大的優勢。

刪除操作:

如果二叉查詢樹中需要刪除的結點左、右子樹都存在,則刪除的時候需要改變一些子樹結構,但所需要付出的代價很小。

具體的插入,刪除演算法請參加《資料結構演算法與應用——搜尋樹》p5-8。[該章節已經上傳到《查詢結構專題(6):動態查詢樹比較 》中]。

二叉查詢樹的效率分析

那麼我們再來看看二叉查詢樹的效率問題

很顯然,在a,b兩圖的二叉查詢樹結構中查詢乙個資料,並不需要遍歷全部的節點元素,查詢效率確實提高了。但是有乙個很嚴重的問題:我們在a圖中查詢8需要比較5次資料,而在b圖中只需要比較3次。更為嚴重的是:如果按有序序列[1 2 3 4 5 6 7 8]建立一顆二叉查詢樹,整棵樹就退化成了乙個線性結構(如c輸入圖:單支樹),此時查詢8需要比較8次資料,和順序查詢沒有什麼不同。

總結一下:最壞情況下,構成的二叉排序樹蛻變為單支樹,樹的深度為n,其查詢時間複雜度與順序查詢一樣o(n)。最好的情況是二叉排序樹的形態和折半查詢的判定樹相同,其平均查詢長度和log2(n)成正比 (o(log2(n)))。

這說明:同樣一組資料集合,不同的新增順序會導致查詢樹的結構完全不一樣,直接影響了查詢效率。

那麼如何解決這個問題呢? 我們會在下面的專題中:《平衡二叉樹》 中來解決。

//原文

二叉查詢樹(BST)

二叉查詢樹,也稱為二叉排序樹,二叉搜尋樹。二叉查詢樹結合了鍊錶插入的靈活性和有序陣列查詢 二分查詢 的高效性。用二叉查詢樹實現有序符號表的api。public class bst,value 有序符號表的相關方法 public intsize private intsize node x publi...

二叉查詢樹BST

樹由node物件組成,每個物件有一對鍵值 兩條鏈結和乙個節點計數器n。每個node物件都是一棵含有n個節點的子樹的根節點,它的左鏈結指向一棵由小於該節點的所有鍵組成的二叉查詢樹,右鏈結指向一棵由大於該節點的所有鍵組成的二叉查詢樹。在bst類中,還應定義乙個node物件root,指向當前二叉樹的根節點...

二叉查詢樹BST

binary search tree bst是一棵資料域有序的樹,其左子樹上的所有結點的資料域均小於或等於根結點的資料域,右子樹上所有結點的資料域均大於根結點的資料域,即其中序遍歷是有序的。二叉查詢樹的基本操作 1.查詢操作 和普通二叉樹的查詢不同,二叉查詢樹可根據資料域的比較對左右子樹選擇遞迴 v...