資料結構 二叉排序樹

2021-10-18 19:17:17 字數 2654 閱讀 1222

二叉排序樹又稱二叉查詢樹。二叉排序樹或是一棵空樹,或是一棵具有下列特性的非空二叉樹:

1)若左子樹非空,則左子樹上所有結點關鍵字值均小於根結點的關鍵字值。

2)若右子樹非空,則右子樹上所有結點關鍵字值均大於根結點的關鍵字值。

3)左、右子樹本身也分別是一棵二叉排序樹

二叉排序樹的查詢是從根結點開始,沿某個分支逐層向下進行比較的過程。若二叉樹非空,則將給定值與根結點的關鍵字比較;若相等,則查詢成功;若不等,則當前結點的關鍵字值大於給定關鍵字值時,在根節點的左子樹查詢,否則在根節點的右子樹中查詢。這是乙個遞迴的過程。

二叉排序樹的遞迴查詢演算法:

bstnode*

bst_search

(bittree t, elemtype key)

if( t-

>data == key)

else

if( t-

>data > key)

else

if( t-

>data < key)

}

二叉排序樹的非遞迴查詢演算法:

bstnode*

bst_search

(bittree t, elemtype key, bstnode*

&p)else

}return t;

}

二叉排序樹是一種動態幾何,其特點是樹的結構通常不是一次生成的,而是在查詢過程中,當樹中不存在關鍵字值等於給定值的結點時在進行插入的。

由於二叉排序樹是遞迴定義的,因此插入結點的過程如下:若二叉排序樹為空,則直接插入結點;否則,若關鍵字k小於根結點關鍵字,則插入左子樹,若關鍵字大於根結點關鍵字,則插入右子樹。

構造一棵二叉樹就是依次輸入資料元素,並將它們插入二叉排序樹中適當位置上的過程。具體過程:每讀入乙個元素,就建立乙個結點,若二叉排序樹非空,則將新結點的值與根結點的值作比較,若小於根結點的值,則插入左子樹,否則插入右子樹;若二叉排序樹為空,則將新結點作為二叉排序樹的根結點。

void

bst_create

(bittree& t, elemtype str)

}

在二叉排序樹中刪除乙個結點時,不能把以結點為根的子樹上的結點都刪除,必須先把被刪除結點從儲存二叉排序樹的鍊錶上摘下,將因刪除結點而斷開的二叉鍊錶重新鏈結起來,同時確保二叉排序樹的性質不會丟失。

刪除操作按三種情況來處理:

若被刪除結點 x 是葉結點,則直接刪除,不會破壞二叉排序樹的性質

若結點 x 只有一棵左子樹或右子樹,則讓 x 的子樹成為 x 父節點 的子樹,替代 x 的位置

若結點 x 有左、右兩棵子樹,則令 x 的直接後繼(或直接前驅)替代 x ,然後從二叉排序樹中刪除這個直接後繼(或直接前驅),這樣就轉換成了第一或第二種情況。

//中序遍歷序列的下乙個節點,即比當前節點大的最小節點,簡稱後繼節點。

intsuccessor

(bsttree* p)

return p-

>data;

}//中序遍歷序列的前乙個節點,即比當前節點小的最大節點,簡稱前驅節點。

intpredecessor

(bsttree* p)

return p-

>data;

}bstnode*

bst_delete

(bsttree& t, elemtype x)

else

else

if( x > t-

>data )

else

else

if( t-

>rchild !=

null

)else}}

return t;

}

對於高度為h的二叉排序樹,插入和刪除操作的執行時間都是o(h)。但在最壞情況下,構造二叉排序樹的輸入序列是有序的,則會形成乙個傾斜的單支樹,此時二叉排序樹的效能新竹變壞,樹的高度也增加為元素個數n。

二叉排序樹的查詢演算法平均查詢長度,主要取決於樹的高度,即與二叉樹的形態有關。若退化成煉表,則為o(n);若為平衡二叉樹,則為o(log2n)。

相同的關鍵字其插入順序不同可能生成不同的二叉排序樹。

如果喜歡的話,不妨關注一波,謝謝啦。

資料結構 二叉排序樹

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

資料結構 二叉排序樹

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

資料結構 二叉排序樹

如果需要乙個滿足 支援排序性 高效插入 刪除操作 高效查詢的資料結構,怎麼做?先看看一些簡單的資料結構 1 排序順序表 陣列 查詢可以採用折半查詢演算法,時間效率為o log2n 插入 刪除操作的時間複雜度為o n 資料量大時,效率太低。2 排序單鏈表 只能採用順序查詢,時間複雜度為o n 不能採用...