版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五電影制作保密合同范本6篇
- 二零二五版木材行業(yè)碳排放權(quán)交易合同范本8篇
- 2025年個(gè)人住宅房產(chǎn)抵押擔(dān)保合同范本
- 課題申報(bào)參考:內(nèi)感受干預(yù)促進(jìn)青少年情緒能力的神經(jīng)基礎(chǔ)
- 課題申報(bào)參考:民事訴訟法的基礎(chǔ)理論和基本制度研究
- 2025年度住宅小區(qū)停車位共有產(chǎn)權(quán)轉(zhuǎn)讓合同范本
- 2025年個(gè)人房產(chǎn)繼承權(quán)轉(zhuǎn)讓合同范本2篇
- 2025版農(nóng)機(jī)具租賃與智能灌溉系統(tǒng)合同4篇
- 二零二五版美容美發(fā)院加盟店會(huì)員管理與服務(wù)合同4篇
- 2025年度高端建筑用熱鍍鋅鋼管采購(gòu)合同3篇
- DB43-T 3022-2024黃柏栽培技術(shù)規(guī)程
- 成人失禁相關(guān)性皮炎的預(yù)防與護(hù)理
- 九宮數(shù)獨(dú)200題(附答案全)
- 人員密集場(chǎng)所消防安全管理培訓(xùn)
- 《聚焦客戶創(chuàng)造價(jià)值》課件
- PTW-UNIDOS-E-放射劑量?jī)x中文說明書
- JCT587-2012 玻璃纖維纏繞增強(qiáng)熱固性樹脂耐腐蝕立式貯罐
- 保險(xiǎn)學(xué)(第五版)課件全套 魏華林 第0-18章 緒論、風(fēng)險(xiǎn)與保險(xiǎn)- 保險(xiǎn)市場(chǎng)監(jiān)管、附章:社會(huì)保險(xiǎn)
- 典范英語2b課文電子書
- 員工信息登記表(標(biāo)準(zhǔn)版)
- 春節(jié)工地停工復(fù)工計(jì)劃安排( 共10篇)
評(píng)論
0/150
提交評(píng)論