二叉排序樹(又稱二叉查詢樹)或一棵空樹,或者是具有下列性質的二叉樹:
1、若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2、若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3、左、右子樹也分別為二叉排序樹;
根據二叉排序樹的定義,左子樹結點值 < 根結點值 < 右子樹結點值,所以對二叉排序樹進行中序遍歷,可以得到乙個遞增的有序序列。
從根節點開始查詢,沿某個分支逐層向下比較的過程。若二叉樹非空,先將給定值與根結點的關鍵字進行比較,若相等,則直接查詢成功;否則,如果小於根結點的關鍵字,則在根結點的左子樹查詢,如果大於根結點的關鍵字,則在根結點的右子樹查詢。這顯然是乙個遞迴的過程;
二叉排序樹的遞迴查詢演算法:
bstnode*
searchbstnode
(bstnode t, elemtype key)
當然了,通過非遞迴方法也是可以的;
下面是非遞迴的演算法:
bstnode*
search_bst
(bstnode t, elemtype key)
return t;
}
二叉排序樹的查詢效率分析:
二叉排序樹的查詢效率主要取決於樹的高度(分三種情況);
1、若二叉排序樹的左右子樹高度之差的絕對值不超過1,則這樣的二叉排序樹成為平衡二叉樹:1n∑
n=1n
(2i+
1∗i)
\frac1n\sum_^n*i)}
n1n=1
∑n(
2i+1
∗i)即它的平均查詢長度為o(log2
n\log_2
log2n
);2、若二叉排序樹為只有乙個左子樹或者右子樹的單只樹(類似於有序的單鏈表):1n∑
n=1n
i\frac1n\sum_^n
n1n=1
∑ni
即其平均查詢長度為o(n);
3、若二叉排序樹為正常二叉排序樹,則其平均查詢長度為1n∑
n=1n
nici
\frac1n\sum_^n
n1n=1
∑nn
ici
首先要知道,二叉排序樹作為一種動態樹表,其特點就是樹的結構通常不是一次生成的,而是在查詢的過程中,當樹種不存在關鍵字值等於給定值的結點時在進行插入的;
插入結點的過程:若原二叉樹為空,則直接插入結點;否則,若關鍵字 k 小於根結點值,則插入到左子樹,若關鍵字 k 大於根結點值,則插入到右子樹。
【注】插入的結點一定是乙個新新增的葉子結點,且是查詢失敗時的查詢路徑上訪問的最後乙個結點的左孩子或右孩子。
二叉排序樹的插入演算法:
int
insert_bst
(bitree &t, keytype k)
else
if(k == t-
>key)
return
false
;//存在相同關鍵字的結點,插入失敗
else
if(k < t-
>key)
return
insert_bst
(t->lchild, k)
;//插入到左子樹
else
return
insert_bst
(t->rchild, k)
;//插入到右子樹
}
二叉排序樹的構造其實就是乙個空樹將元素依次進行插入到相應位置的過程;
構造二叉排序樹的演算法:
void
creat_bst
(bitree &t, keytype str,
int n)
}
在二叉排序樹中刪除乙個結點時,不能把以該結點為根節點的子樹上的結點都刪除,必須先把被刪除結點從儲存二叉排序樹的鍊錶上摘下,將因刪除結點二斷開的二叉鍊錶重新鏈結起來,同時需要保持二叉排序樹的性質不會丟失。由此刪除操作的實現過程按3種情況來處理(設被刪除結點為 z ):
1、刪除結點為葉結點,直接刪除;
2、刪除結點只有一棵左子樹或者右子樹,則讓 z 的子樹成為 z 父結點的子樹(即替代 z 位置);
3、刪除結點有左右兩棵子樹,則需要令 z 的直接後繼或者直接前驅替代 z ,然後從二叉排序樹中刪去這個直接後繼或直接前驅,這樣就轉化為第一或第二種情況了。
二叉排序樹的刪除演算法如下:
void
delete_bstnode
( bitree t, elemtype key)if(
null
== p )
printf
("無此元素!\n");
else
//情況2:結點p的雙親結點為q,且p只有左子樹或只有右子樹,則可將p的左子樹或右子樹直接改為其雙親結點q的左子樹或右子樹。
elseif(
(null
== p-
>rchild &&
null
!= p-
>lchild)
)elseif(
null
== p-
>lchild &&
null
!= p-
>rchild )
//情況3:結點p的雙親結點為q,且p既有左子樹又有右子樹。本**使用直接前驅(也可以直接後繼)
elseif(
null
!= p-
>lchild &&
null
!= p-
>rchild )
temp = s-
>data ;
delete_bstnode
(t, temp)
; p-
>data = temp;}}
}
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...
二叉排序樹
name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...
二叉排序樹
include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...