




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)報(bào)告
課程名:數(shù)據(jù)結(jié)構(gòu)(C語言版)
實(shí)驗(yàn)名:二叉排序樹
姓名:
班級(jí):
學(xué)號(hào):
撰寫時(shí)間:2023.12.18
一實(shí)驗(yàn)?zāi)康呐c規(guī)定
1.掌握二叉排序樹上進(jìn)行插入和刪除的操作
2.運(yùn)用C語言實(shí)現(xiàn)該操作
二實(shí)驗(yàn)內(nèi)容
?對(duì)于一個(gè)線形表,運(yùn)用不斷插入的方法,建立起一株二叉排序樹
?從該二叉排序樹中刪除一個(gè)葉子節(jié)點(diǎn),一個(gè)只有一個(gè)子樹的非葉子節(jié),一
個(gè)有兩個(gè)子樹的非葉子節(jié)點(diǎn)。
三實(shí)驗(yàn)結(jié)果與分析
#include<stdio.h>
ttinclude<stdlib.h>
〃二叉查找樹結(jié)點(diǎn)描述
typedefintKeyType;
typedefstructNode
{
KeyTypekey;//關(guān)鍵字
structNode*1eft;〃左孩子指針
structNode*right;//右孩子指針
structNode*parent;//指向父節(jié)點(diǎn)指針
}Node,*PNode;
//往二叉查找樹中插入結(jié)點(diǎn)
〃插入的話,也許要改變根結(jié)點(diǎn)的地址,所以傳的是二級(jí)指針
voidinseart(PNode*root,KeyTypekey)
//初始化插入結(jié)點(diǎn)
PNodep=(PNode)malloc(sizeof(Node));
p->key=key;
p->left=p->right=p->parent=NULL;
〃空樹時(shí),直接作為根結(jié)點(diǎn)
if((root)==NULL){
*root=p;
return;
}
//插入到當(dāng)前結(jié)點(diǎn)(*root)的左孩子
if((*root)->1eft==NULL&&(*root)->key>ke
y){
p->parent=(*root);
(*root)->left=p;
return;
)
〃插入到當(dāng)前結(jié)點(diǎn)(*root)的右孩子
if((*root)->right==NULL&&(*root)->key<key)
I
p->parent=(*root);
(*root)—>right=p;
return;
}
if((*root)->key>key)
inseart(&(*root)->left,key);
elseif((*root)->key<key)
inseart(&(*root)->right,key);
e1se
return;
}
〃查找元素,找到返回關(guān)鍵字的結(jié)點(diǎn)指針,沒找到返回NULL
PNodesearch(PNoderoot,KeyTypekey)
if(root==NULL)
returnNULL;
if(key>root->key)〃查找右子樹
returnsearch(root->right,key);
elseif(key<root->key)//查找左子樹
returnsearch(root—>left,key);
else
returnroot;
}
〃查找最小關(guān)鍵字,空樹時(shí)返回NULL
PNodesearchMin(PNoderoot)
(
if(root==NULL)
returnNULL;
if(root->left==NULL)
returnroot;
else//一直往左孩子找,直到?jīng)]有左孩子的結(jié)點(diǎn)
returnsearchMin(root->1eft);
)
〃查找最大關(guān)鍵字,空樹時(shí)返回NULL
PNodesearchMax(PNoderoot)
{
if(root==NULL)
returnNULL;
if(root->right==NULL)
returnroot;
else〃一直往右孩子找,直到?jīng)]有右孩子的結(jié)點(diǎn)
returnsearchMax(root->right);
}
〃查找某個(gè)結(jié)點(diǎn)的前驅(qū)
PNodesearchPredecessor(PNodep)
(
//空樹
if(p==NULL)
returnp;
//有左子樹、左子樹中最大的那個(gè)
if(p->left)
returnsearchMax(p->1eft);
//無左子樹.,查找某個(gè)結(jié)點(diǎn)的右子樹遍歷完了
e1se{
if(p->parent==NULL)
returnNULL;
〃向上尋找前驅(qū)
whi1e(p){
if(p->parent->right==p)
break;
p=p->parent;
)
returnp->parent;
)
卜
//查找某個(gè)結(jié)點(diǎn)的后繼
PNodesearchSuccessor(PNodep)
(
〃空樹
if(p==NULL)
returnp;
//有右子樹、右子樹中最小的那個(gè)
if(p->right)
returnsearchMin(p->right);
//無右子樹,查找某個(gè)結(jié)點(diǎn)的左子樹遍歷完了
else{
if(p—>parent==NULL)
returnNULL;
//向上尋找后繼
while(p){
if(p->parent->left==p)
break;
p=p->parent;
}
returnp->parent;
)
)
〃根據(jù)關(guān)鍵字刪除某個(gè)結(jié)點(diǎn),刪除成功返回1,否則返回0
//假如把根結(jié)點(diǎn)刪掉,那么要改變根結(jié)點(diǎn)的地址,所以傳二級(jí)指針
intdeleteNode(PNode*root,KeyTypekey)
(
PNodeq;
//查找到要?jiǎng)h除的結(jié)點(diǎn)
PNodep=search(*root,key);
KeyTypetemp;//暫存后繼結(jié)點(diǎn)的值
〃沒查到此關(guān)鍵字
if(!p)
return0;
//I.被刪結(jié)點(diǎn)是葉子結(jié)點(diǎn),直接刪除
if(p->left==NULL&&p->right==NULL){
〃只有一個(gè)元素,刪完之后變成一顆空樹
if(p->parent==NULL){
free(p);
(*root)=NULL;
}else{
//刪除的結(jié)點(diǎn)是父節(jié)點(diǎn)的左孩子
if(p->parent->left==p)
p->parent—>1eft=NULL;
else//刪除的結(jié)點(diǎn)是父節(jié)點(diǎn)的右孩子
p->parent->right=NULL;
free(p);
}
)
//2.被刪結(jié)點(diǎn)只有左子樹
e1seif(p->left&&!(p—>right)){
p->left—>parent=p->parent;
//假如刪除是父結(jié)點(diǎn),要改變父節(jié)點(diǎn)指針
if(p->parent==NULL)
*root=p->left;
〃刪除的結(jié)點(diǎn)是父節(jié)點(diǎn)的左孩子
elseif(p->parent->left==p)
p->parent->left=p->left;
else〃刪除的結(jié)點(diǎn)是父節(jié)點(diǎn)的右孩子
p->parent->right=p—>left;
free(p);
)
//3.被刪結(jié)點(diǎn)只有右孩子
elseif(p->right&&!(p->1eft)){
p—>right—>parent=p->parent;
//假如刪除是父結(jié)點(diǎn),要改變父節(jié)點(diǎn)指針
if(p->parent==NULL)
*root=p->right;
//刪除的結(jié)點(diǎn)是父節(jié)點(diǎn)的左孩子
elseif(p->parent->1eft==p)
p—>parent->left=p->right;
else〃刪除的結(jié)點(diǎn)是父節(jié)點(diǎn)的右孩子
p->parent->right=p—>right;
free(p);
)
//4.被刪除的結(jié)點(diǎn)既有左孩子,又有右孩子
//該結(jié)點(diǎn)的后繼結(jié)點(diǎn)肯定無左子樹(參考上面查找后繼結(jié)點(diǎn)函數(shù))
〃刪掉后繼結(jié)點(diǎn),后繼結(jié)點(diǎn)的值代替該結(jié)點(diǎn)
e1se{
〃找到要?jiǎng)h除結(jié)點(diǎn)的后繼
q=searchSuccessor(p);
temp=q->key;
//刪除后繼結(jié)點(diǎn)
deleteNode(root,q—>key);
p->key=temp;
)
return1;
//創(chuàng)建一棵二叉查找樹
voidcreate(PNode*root,KeyType*keyArray,intlength)
inti;
//逐個(gè)結(jié)點(diǎn)插入二叉樹中
for(i=0;i<length;i++)
inseart(root,keyArray[i]);
}
intmain(void)
(
inti;
PNoderoot=NULL;
KeyTypenodeArray[11]={
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)村合作社與農(nóng)戶聯(lián)合開發(fā)農(nóng)業(yè)技術(shù)項(xiàng)目協(xié)議
- 通信技術(shù)與信號(hào)處理練習(xí)題
- 技術(shù)標(biāo)準(zhǔn)制定合作協(xié)議
- 數(shù)學(xué)課本九章算術(shù)教案
- 教育資源分布報(bào)告表
- 西廂記的愛情悲劇征文
- 中學(xué)生國學(xué)經(jīng)典故事解讀
- 農(nóng)業(yè)旅游開發(fā)實(shí)施方案
- 數(shù)據(jù)安全與隱私保護(hù)服務(wù)協(xié)議約定事項(xiàng)
- 業(yè)務(wù)往來預(yù)付款協(xié)議書
- 體育測量與評(píng)價(jià)-第二章-體育測量與評(píng)價(jià)的基礎(chǔ)理論課件
- 法律服務(wù)方案(投標(biāo))
- 轉(zhuǎn)移的危險(xiǎn)廢物性狀清單
- 高中英語-新外研版必修一unit5-The-Monarchs-Journey-公開課reading課件
- 建設(shè)項(xiàng)目用地預(yù)審與選址意見課件講解
- 四年級(jí)公共安全教育全冊教案(海峽教育出版社)
- 工程結(jié)構(gòu)通用規(guī)范
- 《構(gòu)成基礎(chǔ)》PPT課件(190頁P(yáng)PT)
- 四年級(jí)道德與法治從中國制造到中國創(chuàng)造
- 2021-2022新教科版四年級(jí)科學(xué)下冊全一冊全部課件(共24課)
- 3 棄渣場施工方案
評(píng)論
0/150
提交評(píng)論