版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、9.1 概述,9.1.1 查找表,9.1.2 相關(guān)術(shù)語,9.1.3 類型說明,9.2 靜態(tài)查找表,9.2.1 概述,9.2.2 順序表的查找,9.2.3 有序表的查找,9.2.4 索引順序表的查找,9.3 動(dòng)態(tài)查找表,9.3.1 概述,9.3.2 二叉排序樹和平衡二叉樹,9.3.3 B-樹和B+樹,9.4 哈希表,9.4.1 定義,9.4.2 哈希函數(shù)的構(gòu)造,9.4.3 處理沖突的方法,9.4.4 哈希表的查找及其分析,第九章查找,(2)平衡二叉樹,定義,平衡二叉樹(Balanced Binary Tree 或Height-Balanced Tree)又稱AVL樹。它或者是一棵空樹,或者是具有
2、下列性質(zhì)的二叉樹:它的左子樹和右子樹都是平衡二叉樹,且左子樹和右子樹的深度之差的絕對值不超過1。,平衡因子BF(Balance Factor):二叉樹上結(jié)點(diǎn)的左子樹的深度減去它的右子樹的深度的值。,由平衡二叉樹的定義易知,平衡二叉樹上所有結(jié)點(diǎn)的平衡因子只可能 是1、0和1。,(2)平衡二叉樹,定義,例如,圖9.6(a)所示為兩棵平衡二叉樹,而圖9.6(b)為兩棵不平衡二叉樹,結(jié)點(diǎn)中的值為該結(jié)點(diǎn)的平衡因子,圖形表示,(a) 平衡二叉樹,(b) 不平衡二叉樹,圖9.6平衡與不平衡二叉樹及結(jié)點(diǎn)的平衡因子,平衡二叉樹是二叉排序樹的另一種形式。 我們希望由任何初始序列構(gòu)成的二叉排序樹都是平衡二叉樹。因?yàn)?/p>
3、平衡二叉樹上任何結(jié)點(diǎn)的左右子樹的深度之差都不超過1,則可以證明它的深度和logN是同數(shù)量級的(其中N是結(jié)點(diǎn)的個(gè)數(shù))。由此,它的平均查找長度也和logN同數(shù)量級。,typedef structBSTNode ElemTypedata; intbf;/結(jié)點(diǎn)的平衡因子 struct BSTNode *lchild, *rchild; /左、右孩子指針 BSTNode, * BSTree;,C語言描述,構(gòu)造二叉平衡(查找)樹的方法是:在插入過程中,采用平衡旋轉(zhuǎn)技術(shù)。,構(gòu)造二叉平衡(查找)樹的方法是: 在插入過程中,采用平衡旋轉(zhuǎn)技術(shù)。,例如:依次插入的關(guān)鍵字為5, 4, 2, 8, 6, 9,5,4,2
4、,4,2,5,8,6,6,5,8,4,2,向右旋轉(zhuǎn) 一次,先向右旋轉(zhuǎn) 再向左旋轉(zhuǎn),9,5,向左旋轉(zhuǎn)一次,繼續(xù)插入關(guān)鍵字 9,假設(shè)由于在二叉排序樹上插入結(jié)點(diǎn)而失去平衡的最小子樹根結(jié)點(diǎn)的指針為a(即a是離插入結(jié)點(diǎn)最近,且平衡因子絕對值超過1的祖先結(jié)點(diǎn)),則失去平衡后進(jìn)行調(diào)整的規(guī)律可歸納為下列4種情況:,平衡調(diào)整,1單向右旋平衡處理: 由于在*a的左子樹根結(jié)點(diǎn)的左子樹上插入結(jié)點(diǎn),*a的平衡因子由1增至2,致使以*a為根的子樹失去平衡,則需進(jìn)行一次向右的順時(shí)針旋轉(zhuǎn)操作。如圖9.6(a)所示。,2單向左旋平衡處理: 由于在*a的右子樹根結(jié)點(diǎn)的右子樹上插入結(jié)點(diǎn),*a的平衡因子由1變?yōu)?,致使以*a為根的子
5、樹失去平衡,則需進(jìn)行一次向左的順逆針旋轉(zhuǎn)操作。如圖9.6(c)所示。,3雙向旋轉(zhuǎn)(先左后右)平衡處理: 由于在*a的左子樹根結(jié)點(diǎn)的右子樹上插入結(jié)點(diǎn),*a的平衡因子由1增至2,致使以*a為根的子樹失去平衡,則需進(jìn)行兩次旋轉(zhuǎn)(先左旋后右旋)操作。如圖9.6(b)所示。,4雙向旋轉(zhuǎn)(先右后左)平衡處理: 由于在*a的右子樹根結(jié)點(diǎn)的左子樹上插入結(jié)點(diǎn),*a的平衡因子由1變?yōu)?,致使以*a為根的子樹失去平衡,則需進(jìn)行兩次旋轉(zhuǎn)(先右旋后左旋)操作。如圖9.6(d)所示。,插入算法,算法思想: 在平衡二叉排序樹BBST上插入一個(gè)新的數(shù)據(jù)元素e的遞歸算法可描述如下:,1若BBST為空樹,則插入一個(gè)數(shù)據(jù)元素為e的
6、新結(jié)點(diǎn)作為BBST的根結(jié) 點(diǎn),樹的深度增1;,2若e的關(guān)鍵字和BBST的根結(jié)點(diǎn)的關(guān)鍵字相等,則不進(jìn)行插入;,3若e的關(guān)鍵字小于BBST的根結(jié)點(diǎn)的關(guān)鍵字,而且在BBST的左子樹中不存在和e有相同關(guān)鍵字的結(jié)點(diǎn),則將e插入在BBST的左子樹上,并且當(dāng)插入之后的左子樹深度增加(1)時(shí),分別就下列不同情況處理之:,iBBST的根結(jié)點(diǎn)的平衡因子為1(右子樹的深度大于左子樹的深度):則將根結(jié)點(diǎn)的平衡因子更改為0,BBST的深度不變;,iiBBST的根結(jié)點(diǎn)的平衡因子為0(左、右子樹的深度相等):則將根結(jié)點(diǎn)的平衡因子更改為1,BBST的深度增1;,iiiBBST的根結(jié)點(diǎn)的平衡因子為1(左子樹的深度大于右子樹的深
7、度): a.若BBST的左子樹根結(jié)點(diǎn)的平衡因子為1,則需進(jìn)行單向右旋平衡處理,并且在右旋處理之后,將根結(jié)點(diǎn)和其右子樹根結(jié)點(diǎn)的平衡因子更改為0,樹的深度不變; b. 若BBST的左子樹根結(jié)點(diǎn)的平衡因子為1,則需進(jìn)行先向左、后向右的雙向旋轉(zhuǎn)平衡處理,并且在旋轉(zhuǎn)處理之后,修改根結(jié) 點(diǎn)和其左、右子樹根結(jié)點(diǎn)的平衡因子,樹的深度不變。,4若e的關(guān)鍵字大于BBST的根結(jié)點(diǎn)的關(guān)鍵字,而且在BBST的右子樹中不存在和e有相同關(guān)鍵字的結(jié)點(diǎn),則將e插入在BBST的右子樹上,并且當(dāng)插入之后的右子樹深度增加(1)時(shí),分別就不同情況處理之。其處理操作和上述3中描述相對稱。,typedef structBSTNode El
8、emTypedata; intbf;/結(jié)點(diǎn)的平衡因子 struct BSTNode *lchild, *rchild; /左、右孩子指針 BSTNode, * BSTree;,算法9.7如下: void R_Rotate (BSTree /p指向新的根結(jié)點(diǎn) / R_Rotate,p,lc,算法9.8如下: void L_Rotate (BSTree /p指向新的根結(jié)點(diǎn) / L_Rotate,p,lc,算法9.10如下:,#defineLH+1/左高 #defineEH0/等高 #defineRH-1/右高 Status InsertAVL (BSTree Tdata = e; Tlchild
9、= Trchild = NULL;,Tbf = EH; taller = TRUE; ,else /應(yīng)繼續(xù)在*T的右子樹中進(jìn)行搜索 if (!InsertAVL(Trchild, e, taller)/未插入 return 0; if (taller)/已插入到*T的右子樹中且右子樹“長高” switch (Tbf) /檢查*T的平衡度 case LH:/原本右子樹比左子樹高,現(xiàn)左、右子樹等高 Tbf = EH; taller = FALSE; break; case EH:/原本左右子樹等高,現(xiàn)因右子樹增高而使樹增高 Tbf = RH; taller = TRUE; break; case
10、RH:/原本右子樹比左子樹高,需要作右平衡處理 RightBalance (T); taller = FALSE; break; / switch (Tbf) / else / else return 1; / InsertAVL,void LeftBalance (BSTree ,case RH: Tbf = EH; lcbf = LH; break; / switch (rdbf) rdbf = EH; L_Rotate (Tlchild);/對*T的左子樹作左旋平衡處理 R_Rotate (T);/對*T作右旋平衡處理 / switch (lcbf) / LeftBalance,在平衡樹上進(jìn)行查找的過程和二叉排序樹相同,因此,查找過程中和給定值進(jìn)行比較的關(guān)鍵字的個(gè)數(shù)不超過平衡 樹的深度。,平衡樹的查找性能分析:,問:含 n 個(gè)關(guān)鍵字的二叉平衡樹可能達(dá)到的最大深度是多少?,n = 0,空樹,最大深度為 0,n = 1,最大深度為 1,n = 2,最大深度為 2,n = 4,最大深度為 3,n = 7,最大深度為 4,先看幾個(gè)具體情況:,反過來問,深度為 h 的二叉平衡樹中所含結(jié)點(diǎn)的最小值 Nh 是多少?,h = 0,N0 = 0,h = 1,h = 2,h = 3,一般情況下,,N1 = 1,N2 = 2,N3 = 4,Nh = Nh-1 +
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026廣西貴港市電子商務(wù)促進(jìn)中心招募就業(yè)見習(xí)人員2人備考題庫及一套完整答案詳解
- 2026山東石油化工學(xué)院人才招聘80人備考題庫附參考答案詳解(a卷)
- 2026山東藥品食品職業(yè)學(xué)院博士后創(chuàng)新實(shí)踐基地招聘備考題庫含答案詳解(培優(yōu))
- 2026四川德陽市城鎮(zhèn)公益性崗位招聘1人備考題庫(區(qū)委黨校)及一套答案詳解
- 2026中證數(shù)據(jù)校園招聘備考題庫附參考答案詳解(綜合卷)
- 2026上半年安徽事業(yè)單位聯(lián)考五河縣招聘20人備考題庫附答案詳解(完整版)
- 2026廣西崇左憑祥市退役軍人服務(wù)中心見習(xí)人員招聘1人備考題庫附答案詳解(a卷)
- 物流效率提升操作手冊
- 2026上半年貴州事業(yè)單位聯(lián)考貴州農(nóng)業(yè)職業(yè)學(xué)院招聘19人備考題庫附答案詳解ab卷
- 2026廣東廣州天河區(qū)工信部電子五所軟件與系統(tǒng)研究部招聘備考題庫帶答案詳解(模擬題)
- 《礦山壓力與巖層控制》教案
- 焊工焊接協(xié)議書(2篇)
- 蘇教版六年級數(shù)學(xué)上冊全套試卷
- 2019-2020學(xué)年貴州省貴陽市八年級下學(xué)期期末考試物理試卷及答案解析
- 培訓(xùn)機(jī)構(gòu)轉(zhuǎn)課協(xié)議
- 冰雪項(xiàng)目策劃方案
- 創(chuàng)客教室建設(shè)方案
- (完整版)南京市房屋租賃合同
- 辦公場地選址方案
- 內(nèi)蒙古衛(wèi)生健康委員會(huì)綜合保障中心公開招聘8人模擬預(yù)測(共1000題)筆試備考題庫及答案解析
- 光伏項(xiàng)目危險(xiǎn)源辨識風(fēng)險(xiǎn)評價(jià)及控制措施清單
評論
0/150
提交評論