一棵二叉查詢樹(bst)是一棵二叉樹,其中每個結點都含有乙個comparable的鍵(以及相關聯的值)且每個結點的鍵都大於其左子樹中的任意結點的鍵而小於右子樹的任意結點的鍵。
和鍊錶一樣,我們巢狀定義了乙個私有類來表示二叉查詢樹上的乙個結點。每個結點都含有乙個鍵、乙個值、一條左鏈結、一條右鏈結和乙個結點計數器。左鏈結指向一棵由小於該結點的所有鍵組成的二叉查詢樹,右鏈結指向一棵大於該結點的所有鍵組成的二叉查詢樹。並且我們能保證下面的公式對於二叉樹中的任意結點x總是成立的:
size(x) = size(x.left) + size(x.right) + 1在二叉查詢樹中查詢乙個鍵的遞迴演算法:如果樹是空的,則查詢未命中;如果被查詢的鍵和根節點的鍵相等,查詢命中,否則我們就遞迴地在適當的子樹中繼續查詢。如果被查詢的鍵較小就選擇左子樹,較大則選擇右子樹。對於命中的查詢,路徑在含有被查詢的鍵的結點處結束。對於未命中的查詢,路徑的終點是乙個空鏈結。
插入的實現邏輯和遞迴查詢很相似:如果樹是空的,就返回乙個含有該鍵值對的新結點;如果被查詢的鍵小於根節點的鍵,我們會繼續在左子樹中插入該鍵,否則在右子樹中插入該鍵。
使用二叉查詢樹的演算法的執行時間取決於樹的形狀,而樹的形狀又取決於鍵被插入的先後順序。在最好的情況下,一棵含有n個結點的樹是完全平衡的,每條空鏈結和根結點的距離都為~lgn。在最壞的情況下,搜尋路徑上可能有n個結點。但在一般情況下樹的形狀和最好情況更接近。
如果根結點的左鏈結為空,那麼一棵二叉查詢樹中最小的鍵就是根結點;如果左鏈結非空,那麼樹中的最小鍵就是左子樹中的最小鍵。找出最大鍵的方法也是類似的,只是變為查詢右子樹而已。
如果給定的鍵key小於二叉查詢樹的根結點的鍵,那麼小於等於key的最大鍵floor(key)一定在根結點的左子樹中;如果給定的鍵key大於二叉查詢樹的根結點,那麼只有當根結點右子樹中存在小於等於key的結點時,小於等於key的最大鍵才會出現在右子樹中,否則根結點就是小於等於key的最大鍵。同理可以得到ceiling()的演算法。
我們在二叉查詢樹的每個結點中維護的子樹結點計數器變數n就是用來支援此操作的。假設我們想找到排名為k的鍵:
rank()是select()的逆方法,它會返回給定鍵的排名。它的實現和select()類似。
要刪除最小鍵,我們不斷深入根結點的左子樹中直至遇見乙個空鏈結,然後將指向該結點的鏈結指向該結點的右子樹。刪除最大鍵類似。
在刪除結點x後用它的後繼結點填補它的位置。因為x有乙個右子結點,因此它的後繼結點就是其右子樹中的最小結點。這樣替換仍然能夠保證樹的有序性,因為x.key和它的後繼結點的鍵之間不存在其他的鍵。
使用中序遍歷,先列印出根結點的左子樹中的所有鍵,然後列印出根結點的鍵,最後列印出根結點的右子樹中的所有鍵。
資料結構與演算法 二叉查詢樹
1.建立bst樹 往bst樹中新增節點 公開的介面函式 param node 需要新增到bst樹的那個節點 public void add treenode node else 隱藏的函式,add方法的具體實現 param parent bst樹 或者子樹 的根節點 param child 要插入b...
《資料結構與演算法 二叉查詢樹》
二叉查詢樹 binary search tree 也被稱作二叉搜尋樹。設x是二叉查詢樹中的任意乙個結點,則x的鍵值大於等於它的左子樹中任意乙個結點的鍵值,小於等於它的右子樹中任意乙個結點的鍵值。1 結點的前驅和後繼 結點的前驅 二叉樹中鍵值小於該結點的最大結點。結點的後繼 二叉樹中鍵值大於該結點的最...
資料結構與演算法(2) 二叉查詢樹
1 右子樹所有節點關鍵字的值都要大於左子樹中的值 2 一般的情況 key left x key x key right 3 查詢操作最壞情況o n 平均情況o lg n 1 插入操作 struct node insert struct node root,struct node new 2 查詢某個...