二叉排序樹
1、二叉排序樹定義與描述:
二叉排序樹又稱為二叉查詢樹,它是一種特殊的二叉樹。
其定義為:二叉樹排序樹或者是一棵空樹, 或者是具有如」下性質的二叉樹:
(1)若它的左子樹非空,則左子樹.上所有結點的值均小於根結點的值;
(2)若它的右子樹非空,則右子樹上所有結點的值均大於(或大於等於)根結點的值;
(3)它的左右子樹也分別為二叉排序樹。
這是乙個遞迴定義。注意只要結點之間具有可比性即可,如下圖(a)中的數字值間的比較,圖(b)中是用單詞字元的ascii碼間的比較。
結構描述:
typedef struct node
bstnode, *bstree;
2.二叉排序樹的建立
假若給定乙個元素序列,我們可以利用逐個插入結點演算法建立一棵二 叉排序樹。因此,實現建立二叉排序樹包括建立樹與插入結點兩個演算法。
[演算法思想]:
首先,將二叉樹序樹初始化為一棵空樹,然後逐個讀入元素,每讀入乙個元素,就建立乙個新的結點,並插
入到當前已生成的二叉排序樹中,即通過多次呼叫二叉排序樹的插入新結點的演算法實現,注意插入時比較結點
的順序始終是從二叉排序樹的根結點開始。
①二叉排序樹的插入
已知乙個關鍵字值為key的結點s,若將其插入到二叉排序樹中,只要保證插入後仍符合二叉排序樹的定義即可。
[演算法思想]:
1)若二叉排序樹是空樹,則key成為二叉排序樹的根;
2)若二叉排序樹非空,則將key與二叉排序樹的根進行比較:
a)如果key的值等於根結點的值,則停止插入;
b)如果key的值小於根結點的值,則將key插入左子樹;
c)如果key的值大於根結點的值,則將key插入右子樹。
例如,設關鍵字的輸入順序為: 45,24,53,12,28,90,按上述演算法生成的二叉排序樹的過程如下圖所示。
實現**:
void insertbst(bstree *bst, keytype key)
/*若在二叉排序樹bst中不存在關鍵字等於key的元素,插入該元素*/
void createbst(bstree *bst)
/*從鍵盤輸入元素的值,建立相應的二叉排序樹*/
}假設共有n個元素,要插入n個結點需要n次插入操作,而插入乙個結點的演算法時間複雜度為0(log2n),因此建立二叉排序樹的演算法時間複雜度為o(nlog2n)。
如果輸入順序為24, 53, 90, 12, 28,45,則生成的二叉排序樹如下圖所示:
3.二叉排序樹的查詢
二叉排序樹的特性:根據二叉排序樹的定義(左子樹小於根結點,右子樹大於根結點),根據二叉樹中序遍歷的定義(先中序遍歷左子樹,訪問根結點,再中序遍歷右子樹),可以得出二叉排序樹的一乙個重要性質,
中序遍歷乙個二叉排序樹,可以得到乙個遞增有序序列。
如圖所示的二叉樹就是一棵二叉排序樹,若中序遍歷下圖的二叉排序樹,則可得到乙個遞增有序序列為:1,2, 3,4,5,6,7 ,8,9。
二叉排序樹查詢的實現方法:
因為二叉排序樹可看作是乙個有序表,所以在二叉排序樹上進行查詢,和折半查詢類似,也是乙個逐步縮小查詢範圍的過程。
首先將待查關鍵字k與根結點關鍵字t進行比較,如果:.
1) k= t: 則返回根結點位址;
2) kt: 則進一步查右子樹。
根據二叉排序樹的定義,在二叉排序樹結構上查詢可以用遞迴與非遞迴兩種實現演算法。
1.二叉排序樹查詢的遞迴演算法
bstree searchbst(bstree bst, keytype key)
/*在根指標bst所指二叉排序樹中,遞迴查詢某關鍵字等於key的元素,若查詢成功,返回
指向該元素結點指標,否則返回空指標*/
if (!bst) retum null;
else if (bst->key == key) retun bst;/*查詢成功*/
else
if (bst->key> key)
retum searchbst(bst->lchild, key);/*在左子樹繼續查詢*/
else
returm searchbst(bst->rchild, key);/*在右子樹繼續查詢*/
}2.二叉排序樹查詢的非遞迴演算法
根據二叉排序樹定義,其查詢也可以用迴圈方式直接實現。
二叉排序樹的非遞迴查詢過程如下:
bstree searchbst(bstree bst, keytype key)
/*在根指標bst所指二叉排序樹bst.上,查詢關鍵字等於key的結點,若查詢成功,返回指向該元素結點指標,否則返回空指標*/
/* searchbst*/
第五周筆記
函式中包含yield語句的函式就是生成器函式,呼叫返回生成器物件.yield 是個表示式,可以返回值.生成器表示式 m i for i in range 10 生成器的應用 1,無限迴圈 2,計數器 3,斐波那契數列 4,生成器互動 5,協程coroutine lambda構建匿名函式 定義 lam...
第二週筆記
直流電機 從1821年法拉第發現有電流流過的導線在磁場中會受到磁場力開始,到1831年皮克西製成一台旋轉式直流發電機。此後科學家的研究則主要在提高利用率 減小體積 減少能量消耗 精確控制等方向。但是直流電機卻有著一些固有的缺點,電壓低時傳輸損耗大,高壓直流電機製造困難,單機容量大時難以實現控制,於是...
雜七雜八筆記
傳統ioe模式 i ibm的伺服器 o oracle資料庫 e emc儲存裝置 乙個io操作其實分成了兩個步驟 發起io請求和實際的io操作。同步io和非同步io的區別就在於第二個步驟是否阻塞,如果實際的io讀寫阻塞請求程序,那麼就是同步io。阻塞io和非阻塞io的區別在於第一步,發起io請求是否會...