資料結構 二叉排序樹

2021-07-23 05:19:39 字數 2138 閱讀 9253

如果需要乙個滿足:

支援排序性、高效插入、刪除操作、高效查詢的資料結構,怎麼做?

先看看一些簡單的資料結構:

1)排序順序表(陣列):查詢可以採用折半查詢演算法,時間效率為o(log2n);插入、刪除操作的時間複雜度為o(n),資料量大時,效率太低。

2)排序單鏈表:只能採用順序查詢,時間複雜度為o(n),不能採用折半查詢法;插入和刪除操作時間負責度為o(n),雖然沒有資料移動,但因為查詢效率太低,導致插入和刪除效率都低。

3)雜湊表(hash table):雖然雜湊表的插入、刪除、查詢的效率較高,但是本身不支援排序性。

下面,介紹乙個資料結構:

二叉排序樹

特點:二叉排序樹,支援排序特性,且插入、刪除、查詢操作的時間複雜度可以達到o(log2n)。

因為其排序特性,

p的左孩子節點值 < p節點的值 < p右孩子節點的值,所以查詢時可以在左、右孩子之間選擇一條路徑,從而將查詢範圍縮小了一半,一次查詢只需要經過從根節點到某節點的一條路勁就可以獲得查詢結果,比較次數最多等於二叉樹的高度,查詢時間複雜度為o(log2n),遠低於o(n)。

注意:二叉排序樹,使用中根次序遍歷,可以得到從小到大的元素值序列。

code:(二叉排序樹的插入實現)

public void insert(t x)

p = new binarynode(x); // 建立葉子節點p

if(x.compareto(parent.data) < 0)

parent.left = p; // 小值放左邊

else

parent.right = p; // 大值放右邊

}

code:(二叉排序樹的查詢實現)

public binarynodesearch(t key)

return p;

}排序二叉樹的刪除稍微複雜一些,有可能出現三種不同的情況:

1)待刪除的節點p為葉子節點,則刪除p節點,並設定其parent的left或right節點為null

2)待刪除的節點為1度節點,則刪除p節點,並用p的孩子節點作為其parent的孩子節點

a若p是parent的左孩子且p有左孩子,設定parent的left指向p的左孩子

b若p是parent的左孩子且有右孩子,設定parent的left指向p的右孩子

c若p是parent的右孩子且p有左孩子,設定parent的right指向p的左孩子

d若p是parent的右孩子且有右孩子,設定parent的right指向p的右孩子

3)待刪除節點為2度節點,則不直接刪除p,而是先用p節點在

中根次序下的後繼節點insucc值代替p節點值,再刪除insucc節點。這樣可以將2度節點的刪除轉變為1度節點的刪除問題,最小程度的調整二叉樹的結構。

code:刪除並返回被刪除的節點

private binarynoderemove(t x, binarynodep, binarynodeparent)

if(null == parent)

if(p == parent.left) // 刪除一度節點或葉子節點,p是parent的左孩子

if(null != p.left)

parent.left = p.left;

else

parent.left = p.right;

else

if(p.left != null)

parent.right = p.left;

else

parent.right = p.right;

return p;

}注意:由於插入和刪除的規則不同,若刪除乙個非葉子節點,再將其立即插入,所得到的排序二叉樹結構不一定與原先的相同。

排序二叉樹,來個總結:

1.插入、刪除、查詢的時間複雜度為o(log2n)

2.先根次序遍歷,可以得到權值的從小到大的排列序列

3.刪除演算法要分三種情況:被刪除的為葉子節點、1度節點、2度節點,其中2度節點的刪除應該轉變為一度節點的刪除,方法就是找到被刪除節點p在中根次序下的後繼節點insucc,將insucc節點的值賦給p,刪除insucc節點即可;1度節點的刪除,將p節點的子節點(無論左、右),放在p的位置,移除p即可。

4.排序二叉樹的查詢效率與樹的高度有關,高度越低,查詢效率越高;反之則相對較低。

資料結構 二叉排序樹

二叉排序樹是一種特殊結構的二叉樹,它作為一種表的組織手段,通常被稱為 樹表。可以作為一種排序和檢索的手段。定義 二叉排序樹或是空樹,或是具有下述性質的二叉樹 其左子樹上所有結點的資料值均小於根結點的資料值 右子樹上所有結點的資料值均大於或等於根結點的資料值。左子樹和右子樹又各是一棵二叉排序樹。對二叉...

資料結構 二叉排序樹

二叉排序樹 binarysorttree 具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 3 左 右子樹也分別為二叉排序樹 include includeusing namespace std type...

資料結構 二叉排序樹

二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值 3 左 右子樹也分別為二叉排序樹 根據二叉樹的定義,左子樹節點值 根節點值 右子樹節點值。所以對二叉排序樹進行...