十一 二叉查詢(排序)樹(符號表的實現)

2021-07-10 14:29:29 字數 4201 閱讀 8874

分析跟有序性有關的api解釋

效能分析

能夠將鍊錶插入的靈活性和有序陣列查詢的高效性結合起來的符號表實現(鍊錶)。具體來說,就是使用每個結點含有兩個鏈結的二叉查詢樹來高效地實現符號表。

定義一些術語:資料結構由結點組成,結點包含的鏈結可以指向空或者其他結點。在二叉樹中,每個結點只能有乙個父節點(根結點例外),每個結點只有左右兩個鏈結,分別指向左子節點右子節點。在二查詢樹中,每個節點還包含了乙個和乙個,鍵之間有順序之分以支援高效的查詢。

**(很全):

注意:左鏈結指向一棵小於該節點的所有鍵組成的二叉查詢樹,右鏈結指向一棵由大於該節點的所有鍵組成的二叉查詢樹。

難點:注意deletemin、deletemax、ceiling、floor寫法(有點繞)

public

class bst, value>

}public

bst()

public boolean isempty()

public

intsize()

// return number of key-value pairs in bst rooted at x

private

intsize(node x)

public boolean contains(key key)

public value get(key key)

private value get(node x, key key)

public

void

put(key key, value val)

root = put(root, key, val);

assert check();

}private node put(node x, key key, value val)

public

void

deletemin()

private node deletemin(node x)

public

void

deletemax()

private node deletemax(node x)

public

void

delete(key key)

private node delete(node x, key key)

x.n = size(x.left) + size(x.right) + 1;

return x;

} public key min()

private node min(node x)

public key max()

private node max(node x)

//return node.key<=key

public key floor(key key)

private node floor(node x, key key)

public key ceiling(key key)

//return node.key>=key

private node ceiling(node x, key key)

return ceiling(x.right, key);

} public key select(int k)

// return key of rank k.

private node select(node x, int k)

public

intrank(key key)

// number of keys in the subtree less than key.

private

intrank(key key, node x)

public iterablekeys()

public iterablekeys(key lo, key hi)

private

void

keys(node x, queuequeue, key lo, key hi)

public

intsize(key lo, key hi)

public

intheight()

private

intheight(node x)

public iterablelevelorder()

return keys;

}private boolean check()

private boolean isbst()

private boolean isbst(node x, key min, key max)

// are the size fields correct?

private boolean issizeconsistent()

private boolean issizeconsistent(node x)

// check that ranks are consistent

private boolean isrankconsistent()

public

static

void

main(string args)

for (string s : st.levelorder())

stdout.println(s + " " + st.get(s));

stdout.println();

for (string s : st.keys())

stdout.println(s + " " + st.get(s));}}

二叉查詢樹鍵的投影是一組有序的鍵列:

查詢示意:

插入示意:

遞迴的理解:

每一次遞迴相當於沿著樹向下搜尋,遞迴的return就是沿著樹向上更新資料

命題c說明二叉查詢樹中查詢隨機鍵的成本比二分查詢(上一節)高約39%,命題d說明這些成本是值得的(插入成本低,二分查詢構造陣列是平方級別的)

floor示意:

select示意:

刪除最小示意:

刪除示意:(用後繼結點替換被刪除結點,也就是豎直投影剛好比被刪除點大的結點)

一直使用後繼結點代替的缺點:使樹不平衡了,因此會產生效能問題

keys的示意:

符號表 二叉查詢樹

實現了二叉查詢樹的 插入,查詢,獲取最大 最小值,刪除最大 最小值,按照給定的鍵值刪除鍵值,向上取整等方法。如下 標頭檔案如下 bst.h created on 2014年6月28日 author zhongchao ifndef bst define bst include include inc...

基於二叉查詢樹的符號表

1.資料表示 我們巢狀定義乙個私有node類來表示二叉查詢樹上的乙個結點。每個結點都含有乙個鍵,乙個值,一條左鏈結,一條右鏈結。左鏈結指向一棵由小於該結點的所有鍵組成的二叉查詢樹,右鏈結指向一棵由大於該結點的所有鍵組成的二叉查詢樹。變數n給出以該結點為根的子樹的結點總數。這樣有 size x siz...

基於二叉查詢樹的符號表(java)

package bst public class bstcomparable value public intsize private intsize node x public value get key key private value get node x,key key public vo...