版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三節(jié)樹(shù)表的查找(一)一、二叉排序樹(shù)1、二叉排序樹(shù)的概念(1)二叉排序樹(shù)的定義二叉排序樹(shù)(BinarySortTree,BST)又稱(chēng)二叉查找,是一種特殊的二叉樹(shù),二叉排序樹(shù)或者是空樹(shù),或者是滿(mǎn)足如下性質(zhì)的二叉樹(shù):①若它的左子樹(shù)非空,則左子樹(shù)上所有結(jié)點(diǎn)的值均小于根結(jié)點(diǎn)的值;②若它的右子樹(shù)非空,則右子樹(shù)上所有結(jié)點(diǎn)的值均大于根結(jié)點(diǎn)的值;③左、右子樹(shù)本身又各是一棵二叉排序樹(shù)。【例】下圖的就是一棵二叉排序樹(shù)中序遍歷序列:15,16,18,19,20,22,30,35,42(2)二叉排序樹(shù)的重要性質(zhì)中根遍歷一棵二叉排序樹(shù)所得的結(jié)點(diǎn)訪(fǎng)問(wèn)序列是按鍵值的遞增序列。(3)二叉排序樹(shù)的數(shù)據(jù)類(lèi)型定義typedefstructnode{KeyTypekey;//關(guān)鍵字DataTypeother;//其他數(shù)據(jù)域structnode*lchild,*rchild;//左右子樹(shù)指針}BsTNode;//結(jié)點(diǎn)類(lèi)型typedefBsTNode*BsTree;//二叉排序樹(shù)類(lèi)型2、二叉排序樹(shù)的插入(1)算法思想在二叉排序樹(shù)中插入新結(jié)點(diǎn),要保證插入后仍滿(mǎn)足BST性質(zhì)。其插入過(guò)程是:①若二叉排序樹(shù)T為空,則為待插入的關(guān)鍵字key申請(qǐng)一個(gè)新結(jié)點(diǎn),并令其為根;②若二叉排序樹(shù)T不為空,則將key和根的關(guān)鍵字比較:若二者相等,則說(shuō)明樹(shù)中已有此關(guān)鍵字key,無(wú)須插入。若key<T→key,則將key插入根的左子樹(shù)中。若key>T→key,則將它插入根的右子樹(shù)中。子樹(shù)中的插入過(guò)程與上述的樹(shù)中插入過(guò)程相同。如此進(jìn)行下去,直到將key作為一個(gè)新的葉結(jié)點(diǎn)的關(guān)鍵字插入到二叉排序樹(shù)中,或者直到發(fā)現(xiàn)樹(shù)中已有此關(guān)鍵字為止。(2)實(shí)例分析【例】寫(xiě)出把無(wú)序序列(20,10,30,15,25,5,35,12,27)建成二叉排序樹(shù)的過(guò)程?!窘獯稹坎捎弥瘘c(diǎn)插入結(jié)點(diǎn)的方法即可建立相應(yīng)的二叉排序樹(shù)。建成二叉排序樹(shù)的過(guò)程如圖所示(3)算法描述BSTreeInsertBST(BSTreeT,BSTNode*S){BSTNode*f,*p=T;while(p)//找插入位置{f=p;//f記錄p的雙親,為將來(lái)插入結(jié)點(diǎn)if(S->key<p->key)p=p->lchild;elsep=p->rchild;}if(T==NULL)T=S;//T為空樹(shù),新結(jié)點(diǎn)作為根結(jié)點(diǎn)elseif(S->key<f->key)f->lchild=S;//作為雙親的左孩子插入elsef->rchild=S;//作為雙親的右孩子插入returnT;}3、二叉排序樹(shù)的生成(1)算法思想從空的二叉樹(shù)開(kāi)始,每輸入一個(gè)結(jié)點(diǎn)數(shù)據(jù),生成一個(gè)新結(jié)點(diǎn),就調(diào)用一次插入算法將它插入到當(dāng)前生成的二又排序樹(shù)中(2)算法描述BSTreeCreateBST(void){//從空樹(shù)開(kāi)始,建立一棵二叉排序樹(shù)BSTreeT=NULL;//初始化T為空樹(shù)KeyTypekey;BSTNode*S;scanf("%d",&key);//輸入第一個(gè)關(guān)鍵字while(key)//假設(shè)key=0是輸入結(jié)束{S=(BSTNode*)malloc(Sizeof(BSTNode));S->key=key;//生成新結(jié)點(diǎn)S->1child=S->rchiId=NULL:T=InsertBST(T,S);//將新結(jié)點(diǎn)*S插入二叉排序樹(shù)Tscanf("%d",&key);//輸入下一個(gè)關(guān)鍵字}returnT;//返回建立的二叉排序樹(shù)}【例】已知某二叉排序樹(shù)10個(gè)結(jié)點(diǎn)的值依次為1~10,其結(jié)構(gòu)如圖所示,試標(biāo)出該二叉樹(shù)各結(jié)點(diǎn)所對(duì)應(yīng)的具體值?!痉治觥扛鶕?jù)二叉排序樹(shù)的的特點(diǎn):對(duì)二叉排序樹(shù)進(jìn)行中序遍歷,得到的是從小到大的序列。給題中給出的二叉樹(shù)各結(jié)點(diǎn)填入字符,如圖所示;再對(duì)該二叉樹(shù)進(jìn)行中序遍歷得到序列:(D,J,I,G,B,A,E,H,C,F(xiàn));根據(jù)二叉排序樹(shù)的的特點(diǎn)和題目要求,這個(gè)序列對(duì)應(yīng)序列(1,2,3,4,5,6,7,8,9,10);將二叉樹(shù)中的字符改為對(duì)應(yīng)得數(shù)字即可。【解答】二叉樹(shù)各結(jié)點(diǎn)所對(duì)應(yīng)的具體值如圖所示。4、二叉排序樹(shù)上的查找(1)算法思想若二叉排序樹(shù)為空,則表明查找失敗,應(yīng)返回空指針。否則,若給定值key等于根結(jié)點(diǎn)的關(guān)鍵字,則表明查找成功,返回當(dāng)前根結(jié)點(diǎn)指針;若給定值key小于根結(jié)點(diǎn)的關(guān)鍵字,則繼續(xù)在根結(jié)點(diǎn)的左子樹(shù)中查找,若給定值key大于根結(jié)點(diǎn)的關(guān)鍵字,則繼續(xù)在根結(jié)點(diǎn)的右子樹(shù)中查找。顯然,這是一個(gè)遞歸的查找過(guò)程,(2)算法描述BSTNode*SearchBST(BSTreeT,KeyTypex){//在二叉排序樹(shù)上查找關(guān)鍵字值為x的結(jié)點(diǎn)if(T==NULL||T->key==x)returnT;if(x<T->key)returnSearchBST(T->lchild,x);elsereturnSearchBST(T->rchild,x);}(3)算法分析二叉排序樹(shù)上的查找長(zhǎng)度與二叉排序樹(shù)的形態(tài)有關(guān),若二叉排序樹(shù)是一棵理想的平衡樹(shù)(是指樹(shù)中任一結(jié)點(diǎn)的左右子樹(shù)的高度差不能大于1),則進(jìn)行查找的時(shí)間復(fù)雜度為O(log2n);若退化為一棵單支樹(shù),則其查找的時(shí)間復(fù)雜度為O(n)。對(duì)于一般情況,其時(shí)間復(fù)雜度應(yīng)為O(log2n)?!纠拷o定表(20,15,18,12,25,27,30,22,17,20,28),按數(shù)據(jù)元素在表中的次序構(gòu)造一棵二叉排序樹(shù),求出其平均查找長(zhǎng)度?!窘獯稹堪凑諛?gòu)造二叉排序樹(shù)方法,構(gòu)造結(jié)果如圖所示。平均查找長(zhǎng)度為:(1+2×2+4×3+3×4+5×1)/11=34/115、二叉排序樹(shù)上的刪除從BST樹(shù)上刪除一個(gè)結(jié)點(diǎn),仍然要保證刪除后滿(mǎn)足BST的性質(zhì)。設(shè)被刪除結(jié)點(diǎn)為p,其父結(jié)點(diǎn)為f,如圖(a)所示的BST樹(shù)。具體刪除情況分析如下:(1)若p是葉子結(jié)點(diǎn):直接刪除p,如圖(b)所示。(2)若p只有一棵子樹(shù)(左子樹(shù)或右子樹(shù)),直接用p的左子樹(shù)(或右子樹(shù))取代p的位置而成為f的一棵子樹(shù)。即原來(lái)p是f的左子樹(shù),則p的子樹(shù)成為f的左子樹(shù);原來(lái)p是f的右子樹(shù),則p的子樹(shù)成為f的右子樹(shù),如圖(c)所示。(3)若p既有左子樹(shù)又有右子樹(shù),處理方法有以下兩種,可以任選其中一種。①用p的直接前驅(qū)結(jié)點(diǎn)(中序遍歷)代替p,即從p的左子樹(shù)中選擇值最大的結(jié)點(diǎn)s放在p的位置(用結(jié)點(diǎn)s的內(nèi)容替換結(jié)點(diǎn)p內(nèi)容),然后刪除結(jié)點(diǎn)s。s是p的左子樹(shù)中最右邊的結(jié)點(diǎn)且沒(méi)有右子樹(shù),如圖(d)所示。②用p的直接后繼結(jié)點(diǎn)(中序遍歷)代替p,即從p的右子樹(shù)中選擇值最小的結(jié)點(diǎn)s放在p的位置(用結(jié)點(diǎn)s的內(nèi)容替換結(jié)點(diǎn)p的內(nèi)容),然后刪除結(jié)點(diǎn)s。s是p的右子樹(shù)中的最左邊的結(jié)點(diǎn)且沒(méi)有左子樹(shù)。例如,對(duì)圖(a)所示的二叉
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全球及中國(guó)同步發(fā)電機(jī)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025版事業(yè)單位聘用合同續(xù)簽與培訓(xùn)發(fā)展支持協(xié)議3篇
- 2025年度個(gè)人股權(quán)交易合同模板2篇
- 2025年度個(gè)人戶(hù)外用品租賃融資合同范本民間版4篇
- 科技驅(qū)動(dòng)下的校園安全教育新模式
- 二零二五年度出租車(chē)企業(yè)車(chē)輛油耗監(jiān)控合同3篇
- 二零二五年度車(chē)牌租賃企業(yè)信用評(píng)估合同協(xié)議4篇
- 二零二五年度車(chē)輛維修配件無(wú)償借用合作協(xié)議4篇
- 2025年度企事業(yè)單位食堂及便利店整體承包合作協(xié)議3篇
- 跨學(xué)科教育背景下的多元職業(yè)發(fā)展
- 30題紀(jì)檢監(jiān)察位崗位常見(jiàn)面試問(wèn)題含HR問(wèn)題考察點(diǎn)及參考回答
- 高考作文復(fù)習(xí)任務(wù)驅(qū)動(dòng)型作文的審題立意課件73張
- 詢(xún)價(jià)函模板(非常詳盡)
- 《AI營(yíng)銷(xiāo)畫(huà)布:數(shù)字化營(yíng)銷(xiāo)的落地與實(shí)戰(zhàn)》
- 麻醉藥品、精神藥品、放射性藥品、醫(yī)療用毒性藥品及藥品類(lèi)易制毒化學(xué)品等特殊管理藥品的使用與管理規(guī)章制度
- 一個(gè)28歲的漂亮小媳婦在某公司打工-被老板看上之后
- 乘務(wù)培訓(xùn)4有限時(shí)間水上迫降
- 2023年低年級(jí)寫(xiě)話(huà)教學(xué)評(píng)語(yǔ)方法(五篇)
- DB22T 1655-2012結(jié)直腸外科術(shù)前腸道準(zhǔn)備技術(shù)要求
- GB/T 16474-2011變形鋁及鋁合金牌號(hào)表示方法
- 氣管切開(kāi)病人的觀察與護(hù)理【版直接用】課件
評(píng)論
0/150
提交評(píng)論