第七周筆記

2022-07-18 16:48:26 字數 2691 閱讀 4799

二叉排序樹

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請求是否會...