




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
二叉搜索樹(BinarySearchTree)定義
二叉搜索樹或者是一棵空樹,或者是具有下列性質(zhì)的二叉樹:每個(gè)結(jié)點(diǎn)都有一個(gè)作為搜索依據(jù)的關(guān)鍵碼(key),所有結(jié)點(diǎn)的關(guān)鍵碼互不相同。左子樹(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵碼都小于根結(jié)點(diǎn)的關(guān)鍵碼。右子樹(如果非空)上所有結(jié)點(diǎn)的關(guān)鍵碼都大于根結(jié)點(diǎn)的關(guān)鍵碼。左子樹和右子樹也是二叉搜索樹。1351545504025102030二叉搜索樹例結(jié)點(diǎn)左子樹上所有關(guān)鍵碼小于結(jié)點(diǎn)關(guān)鍵碼;右子樹上所有關(guān)鍵碼大于結(jié)點(diǎn)關(guān)鍵碼;注意:若從根結(jié)點(diǎn)到某個(gè)葉結(jié)點(diǎn)有一條路徑,路徑左邊的結(jié)點(diǎn)的關(guān)鍵碼不一定小于路徑上的結(jié)點(diǎn)的關(guān)鍵碼。如箭頭所示路徑。2性質(zhì):如果對(duì)一棵二叉搜索樹進(jìn)行中序遍歷,可以按從小到大的順序,將各結(jié)點(diǎn)關(guān)鍵碼排列起來,所以也稱二叉搜索樹為二叉排序樹(BST)。二叉搜索樹的類定義——略二叉搜索樹的類定義用二叉鏈表作為它的存儲(chǔ)表示,許多操作的實(shí)現(xiàn)與二叉樹類似。3二叉搜索樹的搜索算法在二叉搜索樹上進(jìn)行搜索,是一個(gè)從根結(jié)點(diǎn)開始,沿某一個(gè)分支逐層向下進(jìn)行比較判等的過程。它可以是一個(gè)遞歸的過程。假設(shè)想要在二叉搜索樹中搜索關(guān)鍵碼為x
的元素,搜索過程從根結(jié)點(diǎn)開始。如果根指針為NULL,則搜索不成功;否則用給定值
x
與根結(jié)點(diǎn)的關(guān)鍵碼進(jìn)行比較:若給定值等于根結(jié)點(diǎn)關(guān)鍵碼,則搜索成功,返回搜索成功信息并報(bào)告搜索到結(jié)點(diǎn)地址。4若給定值小于根結(jié)點(diǎn)的關(guān)鍵碼,則繼續(xù)遞歸搜索根結(jié)點(diǎn)的左子樹;否則。遞歸搜索根結(jié)點(diǎn)的右子樹。搜索45搜索成功搜索28搜索失敗3515455040251020305BSTNode*Search(Tx,
BSTNode*subtree){//遞歸算法:在以
subtree
為根的二叉搜索樹中//
搜索含x的結(jié)點(diǎn)。若找到,則函數(shù)返回該結(jié)點(diǎn)//的地址,否則函數(shù)返回NULL值。 if(subtree==NULL)returnNULL;
elseif(x<subtree->data) returnSearch(x,subtree->left); elseif(x>subtree->data) returnSearch(x,
subtree->right); elsereturnsubtree; //搜索成功}6BSTNode*Search(Tx,
BSTNode*subtree){//迭代算法:在當(dāng)前以subtree
為根的二叉搜索//樹中搜索含x的結(jié)點(diǎn)。若找到,則函數(shù)返回該//結(jié)點(diǎn)的地址,否則函數(shù)返回NULL值。while(subtree!=NULL){
if(x==subtree->data)returnsubtree; if(x<subtree->data)
subtree=subtree->left; elsesubtree=subtree->right;}returnNULL;}7搜索過程是從根結(jié)點(diǎn)開始,沿某條路徑自上而下逐層比較判等的過程。搜索成功,搜索指針將停留在樹上某個(gè)結(jié)點(diǎn);搜索不成功,搜索指針將走到樹上某個(gè)結(jié)點(diǎn)的空子樹。設(shè)樹的高度為h,最多比較次數(shù)不超過h。8二叉搜索樹的插入算法為了向二叉搜索樹中插入一個(gè)新元素,必須先檢查這個(gè)元素是否在樹中已經(jīng)存在。在插入之前,先使用搜索算法在樹中檢查要插入的元素在不在樹中。如果搜索成功,說明樹中已經(jīng)有這個(gè)元素,不再插入;如果搜索不成功,說明樹中原來沒有關(guān)鍵碼等于給定值的結(jié)點(diǎn),把新元素加到搜索操作停止的地方。9插入新結(jié)點(diǎn)
28二叉搜索樹的插入每次結(jié)點(diǎn)的插入,都要從根結(jié)點(diǎn)出發(fā)搜索插入位置,然后把新結(jié)點(diǎn)作為葉結(jié)點(diǎn)插入。3515455040251020302810二叉搜索樹的插入算法bool
Insert(Te,BSTNode&subtree){//遞歸算法:在以subtree
為根的二叉搜索樹中插入//值為e的結(jié)點(diǎn)。若樹中已有結(jié)點(diǎn)e,則不插入
if(subtree==NULL){//新結(jié)點(diǎn)作為葉結(jié)點(diǎn)插入
subtree=newBSTNode(e);//創(chuàng)建新結(jié)點(diǎn) returntrue;}elseif(e<subtree->data)Insert(e,subtree->left); elseif(e>subtree->data)Insert(e,subtree->right);};11注意參數(shù)表中引用型指針參數(shù)subtree的使用。利用二叉搜索樹的插入算法,可以很方便地建立二叉搜索樹。
12輸入數(shù)據(jù)
{53,78,65,17,87,09,81,15}53537853786553786517537865871753786509178753786581178709537865151787098113voidcreateBST(TEndValue){//從鍵盤上輸入元素序列,建立一棵二叉搜索樹,//參數(shù)
EndValue
表示序列的結(jié)束符
root=NULL;//root為樹根,初始化為空樹
cin>>x; //輸入數(shù)據(jù)
while(x.key!=EndValue){ //RefValue是一個(gè)輸入結(jié)束標(biāo)志
Insert(x,root);cin>>x; //插入,再輸入數(shù)據(jù)
}}14二叉搜索樹的刪除算法在二叉搜索樹中刪除一個(gè)結(jié)點(diǎn)時(shí),必須將因刪除結(jié)點(diǎn)而斷開的二叉鏈表重新鏈接起來,同時(shí)確保二叉搜索樹的性質(zhì)不會(huì)失去。為保證在刪除后樹的搜索性能不至于降低,還需要防止重新鏈接后樹的高度增加。刪除葉結(jié)點(diǎn),只需將其雙親結(jié)點(diǎn)指向它的指針清零,再釋放它即可。被刪結(jié)點(diǎn)右子樹為空,可以拿它的左子女結(jié)點(diǎn)頂替它的位置,再釋放它。15被刪結(jié)點(diǎn)左子樹為空,可以拿它的右子女結(jié)點(diǎn)頂替它的位置,再釋放它。被刪結(jié)點(diǎn)左、右子樹都不為空,可以在它的右子樹中尋找中序下的第一個(gè)結(jié)點(diǎn)(關(guān)鍵碼最小),用它的值填補(bǔ)到被刪結(jié)點(diǎn)中,再來處理這個(gè)結(jié)點(diǎn)的刪除問題。5378651787092345刪除45右子樹空,用左子女頂替53786517870923168853788817940923刪除78左子樹空,用右子女頂替53948817092353788117940945刪除78在右子樹上找中序下第一個(gè)結(jié)點(diǎn)填補(bǔ)236553818817940945236517二叉搜索樹的刪除算法bool
Remove(x,BSTNode&subtree){//遞歸算法:在以subtree
為根的二叉搜索樹中//
刪除含x的結(jié)點(diǎn)
if(subtree==NULL)return
false;
if(x<subtree->data)//在左子樹中執(zhí)行刪除 returnRemove(x,subtree->left);
elseif(x>subtree->data)//在右子樹中執(zhí)行刪除
return
Remove(x,subtree->right);
else{//
找到了被刪結(jié)點(diǎn)18
//1.左、右子女均不空 if(subtree->left!=NULL&&
subtree->right!=NULL){ //subtree指示關(guān)鍵碼為x的結(jié)點(diǎn),它有兩個(gè)子女 temp=subtree->right;
//到右子樹搜尋中序下第一個(gè)結(jié)點(diǎn)
while(temp->left!=NULL)temp=temp->left;
subtree->data=temp->data;
//用該結(jié)點(diǎn)數(shù)據(jù)代替根結(jié)點(diǎn)數(shù)據(jù) Remove(temp->data,subtree->right); }19 else{//subtree指示的結(jié)點(diǎn)最多有一個(gè)子女 temp=subtree;
if(subtree->left==NULL)subtree=
subtree->right; elsesubtree=subtree->left;deletetemp; returntrue; } }}注意在刪除算法參數(shù)表引用型指針參數(shù)的使用。20
二叉搜索樹性能分析對(duì)于有n個(gè)關(guān)鍵碼的集合,其關(guān)鍵碼有n!種不同排列,可構(gòu)成不同二叉搜索樹有
(棵)
{2,1,3}{1,2,3}{1,3,2}{2,3,1}{3,1,2}{3,2,1}
12311113222332321同樣3個(gè)數(shù)據(jù){1,2,3},輸入順序不同,建立起來的二叉搜索樹的形態(tài)也不同。這直接影響到二叉搜索樹的搜索性能。如果輸入序列選得不好,會(huì)建立起一棵單支樹,使得二叉搜索樹的高度達(dá)到最大。用樹的搜索效率來評(píng)價(jià)這些二叉搜索樹。為此,在二叉搜索樹中加入外結(jié)點(diǎn),形成判定樹。外結(jié)點(diǎn)表示失敗結(jié)點(diǎn),內(nèi)結(jié)點(diǎn)表示搜索樹中已有的數(shù)據(jù)。這樣的判定樹即為擴(kuò)充的二叉搜索樹。22舉例說明。已知關(guān)鍵碼集合
{a1,a2,a3}=
{do,if,to},對(duì)應(yīng)搜索概率p1,p2,p3,在各搜索不成功間隔內(nèi)搜索概率分別為q0,q1,q2,q3??赡艿亩嫠阉鳂淙缦滤?。doiftodoiftoq0q1p1q2p2q3p3q0q1q2q3p1p2p3(a)(b)23判定樹doiftoq0q1p1q2p2q3p3doiftoq0q1p1q2p2q3p3(d)(c)doiftoq0q1p1q2p2q3p3(e)24在判定樹中
○表示內(nèi)部結(jié)點(diǎn),包含了關(guān)鍵碼集合中的某一個(gè)關(guān)鍵碼;□表示外部結(jié)點(diǎn),代表各關(guān)鍵碼間隔中的不在關(guān)鍵碼集合中的關(guān)鍵碼。在每?jī)蓚€(gè)外部結(jié)點(diǎn)間必存在一個(gè)內(nèi)部結(jié)點(diǎn)。一棵判定樹上
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五暑期工勞務(wù)派遣與就業(yè)環(huán)境優(yōu)化合同
- 二零二五年度物流公司貨車司機(jī)服務(wù)質(zhì)量考核與獎(jiǎng)勵(lì)協(xié)議
- 2025年度網(wǎng)絡(luò)安全防護(hù)等級(jí)評(píng)定安全協(xié)議書
- 2025年度汽車零部件貨物運(yùn)輸安全與質(zhì)量協(xié)議
- 二零二五年度環(huán)保產(chǎn)業(yè)技術(shù)人才招聘與綠色創(chuàng)新協(xié)議
- 2025年度環(huán)保型清潔公司員工聘用合同書
- 二零二五年度水利設(shè)施監(jiān)控維保及災(zāi)害預(yù)警服務(wù)合同
- 二零二五年度海鮮水產(chǎn)店轉(zhuǎn)讓與經(jīng)營(yíng)協(xié)議
- 二零二五年度倆人共同創(chuàng)業(yè)經(jīng)營(yíng)咖啡廳合伙協(xié)議
- 二零二五年度農(nóng)村土地租賃合同模板(現(xiàn)代農(nóng)業(yè)物流園區(qū))
- 煤礦應(yīng)急救援培訓(xùn)教案
- 《圖書館資源利用》課件
- 2024-2030年中國(guó)光伏建筑一體化(BIPV)行業(yè)發(fā)展模式規(guī)劃分析報(bào)告
- 設(shè)備工程師招聘面試題與參考回答
- 部編版小學(xué)道德與法治五年級(jí)下冊(cè)《不甘屈辱-奮勇抗?fàn)帯返谝徽n時(shí)課件
- 《贏利》精讀圖解
- 讀書分享讀書交流會(huì)《你當(dāng)像鳥飛往你的山》課件
- 大學(xué)生職業(yè)素養(yǎng)訓(xùn)練(第六版)教案 第二單元 學(xué)習(xí)職業(yè)禮儀
- 2022年中華護(hù)理學(xué)會(huì)輸液連接裝置安全管理專家共識(shí)解讀
- 內(nèi)鏡下ESD護(hù)理配合
- DB34∕T 1644-2012 南方紅豆杉用材林栽培技術(shù)規(guī)程
評(píng)論
0/150
提交評(píng)論