版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、實用標準文檔數(shù)據(jù)結(jié)構(gòu)實驗報告題目: 二叉樹抽象數(shù)據(jù)類型的實現(xiàn)學院* 學院專業(yè)*年級班別*學號*學生姓名*指導教師成績 _2012年6月文案大全實用標準文檔報告:內(nèi)容:詳細完整不完整設(shè)計方案:非常合理合理較差實現(xiàn):全部實現(xiàn)部分實現(xiàn)未實現(xiàn)文檔格式:規(guī)范基本規(guī)范不規(guī)范答辯:理解題目透徹,問題回答流利理解題目較透徹,回答問題基本正確部分理解題目,部分問題回答正確未能完全理解題目,答辯情況較差總評成績:優(yōu)良中及格不及格文案大全實用標準文檔一實驗概要二叉樹抽象數(shù)據(jù)類型的實現(xiàn)二 . 實驗目的1. 了解二叉樹的定義以及各項基本操作。2. 實現(xiàn)二叉樹存儲、遍歷及其他基本功能三.實驗儀器設(shè)備和材料Visual s
2、tudio 2010四實驗的內(nèi)容1. 二叉樹類型定義以及各基本操作的簡要描述;ADT BinaryTree 數(shù)據(jù)對象 D:D 是具有相同特性的數(shù)據(jù)元素的集合.數(shù)據(jù)關(guān)系 R:若 D=?,則 R=,稱 BinaryTree 為空二叉樹;若 D,則 R=H, H 是如下二元關(guān)系:(1) 在 D中存在惟一的稱為根的數(shù)據(jù)元素 root ,它在關(guān)系 H 下無前驅(qū);(2) 若 D-root ?,則存在 D-root=D1,Dr ,且 D1 Dr=?;(3) 若 D1?,則 D1 中存在惟一的元素 x1,H,且存在 Dr上的關(guān)系 HrH;H=, ,H1,Hr ;(4) (D1, H1 )是一棵符合本定義的二叉
3、樹,稱為根的左子樹,是一棵符合本定義的二叉樹,稱為根的右子樹?;静僮?P:InitBiTree(&T);操作結(jié)果:構(gòu)造空二叉樹T。DestroyBiTree(&T);初始條件:二叉樹T 存在。操作結(jié)果:銷毀二叉樹T。CreateBiTree(&T,definition);初始條件: definition給出二叉樹 T 的定義。操作結(jié)果:按 definition構(gòu)造二叉樹 T。ClearBiTree(&T);初始條件:二叉樹T 存在。操作結(jié)果:將二叉樹T 清為空樹。BiTreeEmpty(T);初始條件:二叉樹T 存在。操作結(jié)果:若 T 為空二叉樹,則返回TURE,否則 FALSE。BiTre
4、eDepth(T);初始條件:二叉樹T 存在。文案大全實用標準文檔操作結(jié)果:返回T 的深度。Root(T);初始條件:二叉樹T 存在。操作結(jié)果:返回T 的根。Value(T,e);初始條件:二叉樹T 存在, e 是 T 中的某個結(jié)點。操作結(jié)果:返回 e 的值。Assign(T,&e,value);初始條件:二叉樹T 存在, e 是 T 中的某個結(jié)點。操作結(jié)果:結(jié)點e 賦值為 value 。Parent(T,e);初始條件:二叉樹T 存在, e 是 T 中的某個結(jié)點。操作結(jié)果:若 e 是 T 的非跟結(jié)點,則返回它的雙親,否則返回“空”。LeftChild(T,e);初始條件:二叉樹T 存在, e
5、 是 T 中的某個結(jié)點。操作結(jié)果:返回e 的左孩子。若 e 無左孩子,則返回“空” 。RightChild(T,e);初始條件:二叉樹T 存在, e 是 T 中的某個結(jié)點。操作結(jié)果:返回e 的右孩子。若 e 無右孩子,則返回“空” 。LeftSibling(T,e);初始條件:二叉樹T 存在, e 是 T 中的某個結(jié)點。操作結(jié)果:返回 e 的左兄弟。若 e 無左孩子或無左兄弟,則返回“空” 。RightSibling(T,e);初始條件:二叉樹T 存在, e 是 T 中的某個結(jié)點。操作結(jié)果:返回 e 的右兄弟。若 e 無右孩子或無右兄弟,則返回“空” 。ADT BinaryTree2. 所選擇
6、的存儲結(jié)構(gòu)描述及在此存儲結(jié)構(gòu)上各基本操作的實現(xiàn);3. 源代碼主文件 :main.ccp:#includebase.h/公用頭文件、公共常量及公共函數(shù)等#includebitree.h/二叉樹二叉鏈表基本操作voidMenu();/菜單函數(shù)voidProduce(char *str);/隨機產(chǎn)生二叉樹先序序列函數(shù)intmain()/主函數(shù)BiTree T,bt,insert_bt;charcmd,strMAXSIZE,elem;intloc,temp;文案大全實用標準文檔InitBiTree(T);/初始化二叉鏈表二叉樹Menu();/顯示菜單while(1)ClearLine();/清空結(jié)果顯
7、示區(qū)printf(請選擇操作: ( 按 Q 退出 );cmd = getch();ClearLine();fflush(stdin);switch(cmd)case 0:/隨機創(chuàng)建一棵二叉樹while(cmd != y & cmd != Y)Produce(str);/隨機產(chǎn)生二叉樹先序序列CreateBiTree(T,str);/用此序列建樹ShowBiTree(T);/廣義表形式顯示printf(使用創(chuàng)建的這個二叉樹?);cmd = getch();ClearLine();break;case 2:/手動創(chuàng)建一棵二叉樹printf( 請按二叉樹先序序列輸入二叉樹: ( 空結(jié)點用空格 表示
8、)n ); CreateBiTree(T);ClearLine();printf(二叉樹創(chuàng)建成功!n);ShowBiTree(T);getch();break;case 4:/銷毀二叉樹DestroyBiTree(T);printf(二叉樹已被銷毀!);getch();break;case 6:/判空if(BiTreeEmpty(T) printf(二叉樹是空二叉樹。);elseprintf(二叉樹非空 );getch();break;case 8:/求深度printf(深度是 %d,BiTreeDepth(T);getch();break;文案大全實用標準文檔case a:/求左孩子Show
9、BiTree(T);printf(你想求哪個字符的左孩子?);doelem = getchar();ClearLine();bt = SearchBiTree(T,elem);/查找指定的結(jié)點值elemif(!bt) printf(你輸入的結(jié)點不存在! 請重新輸入:);while(!bt);ClearLine();bt = LeftChild(T,bt);/求左孩子if(bt) printf( %c的左孩子是 %c,elem,bt-data);elseprintf( %c沒有左孩子 ,elem);printf(n參照二叉樹 :);ShowBiTree(T);getch();break;case
10、 c:/求右孩子ShowBiTree(T);printf(你想求哪個字符的右孩子?);doelem = getchar();ClearLine();bt = SearchBiTree(T,elem);if(!bt) printf(你輸入的結(jié)點不存在! 請重新輸入:);while(!bt);ClearLine();bt = RightChild(T,bt);if(bt) printf( %c的右孩子是 %c,elem,bt-data);elseprintf( %c沒有右孩子 ,elem);printf(n參照二叉樹 :);ShowBiTree(T);getch();break;case 1:/先
11、序遍歷if(!BiTreeEmpty(T)printf(先序遍歷序列為:);PreOrderTraverse(T,Visit);else printf(二叉樹空,請先建樹!);getch();break;case 3:/中序遍歷文案大全實用標準文檔if(!BiTreeEmpty(T)printf(中序遍歷序列為:);InOrderTraverse(T,Visit);else printf(二叉樹空,請先建樹!);getch();break;case 5:/后序遍歷if(!BiTreeEmpty(T)printf(后序遍歷序列為:);PostOrderTraverse(T,Visit);else
12、 printf(二叉樹空,請先建樹!);getch();break;case 7:/層次遍歷if(!BiTreeEmpty(T)printf(層次遍歷序列為:);LevelOrderTraverse(T,Visit);else printf(二叉樹空,請先建樹!);getch();break;case 9:/插入一棵二叉樹為另一棵二叉樹的子樹do/隨機創(chuàng)建一棵右孩子為空Produce(str);/且層數(shù)小于4 的樹CreateBiTree(insert_bt,str);while(insert_bt-rchild|BiTreeDepth(insert_bt) 3);printf(先隨機創(chuàng)建一棵
13、右子樹空的二叉樹如圖n);ShowBiTree(insert_bt);/新創(chuàng)建的樹getch();printf(你想插入這棵樹為原樹哪個結(jié)點的子樹:n);ShowBiTree(T);bt = SearchBiTree(T,getchar();ClearLine();printf(你想插入為0.左孩子1.右孩子 :);fflush(stdin);scanf(%d,&loc);if(!InsertChild(T, bt, loc, insert_bt)printf(插入出錯 !);else文案大全實用標準文檔ClearLine();printf(插入成功 ! 插入后 T 廣義表形式為:n);Sho
14、wBiTree(T);getch();break;case b:/刪除指定結(jié)點的子樹ShowBiTree(T);printf(你想刪除哪個結(jié)點的子樹?);fflush(stdin);bt = SearchBiTree(T,getchar();printf(n你想刪除0. 左子樹 1. 右子樹 : );fflush(stdin);scanf(%d,&loc);ClearLine();if(!DeleteChild(T,bt,loc) printf(刪除出錯 !);else printf(刪除成功,檢查結(jié)果n);ShowBiTree(T);getch();break;case e:/返回先序序列第
15、i 個結(jié)點的值printf(請輸入一個結(jié)點的先序序列序號: );scanf(%d,&loc);temp = loc;ClearLine();elem = Value(T,temp);printf(參照二叉樹 :);ShowBiTree(T);printf(n);if(elem = )printf(該結(jié)點不存在。);else printf(先序序列第 %d個結(jié)點值為 %c,loc,elem);getch();break;case d:/結(jié)點賦值ShowBiTree(T);printf(請輸入要賦值的結(jié)點: );doelem = getchar();ClearLine();bt = SearchB
16、iTree(T,elem);if(!bt) printf(你輸入的結(jié)點不存在! 請重新輸入:);while(!bt);ClearLine();printf(請輸入新值 : );fflush(stdin);文案大全實用標準文檔elem = getchar();Assign(T,bt,elem);printf(賦值成功,請查看二叉樹狀態(tài).n);ShowBiTree(T);getch();break;case Q:/退出case q: exit(0);return 0;voidMenu()/顯示菜單函數(shù)printf( 0.隨機創(chuàng)建 CreateBiTree()1.先序遍歷 PreOrderTrave
17、rse();printf(nn2.手 動創(chuàng) 建CreateBiTree()3.中序 遍歷InOrderTraverse();printf(nn4.銷 毀DestoryBiTree()5.后 序 遍 歷PostOrderTraverse();printf(nn6.判 空BiTreeEmpty()7.層 次 遍 歷LevelOrderTraverse();printf(nn 8.求深度BiTreeDepth()9.插入子樹InsertChild();printf(nn a.求左孩子 LeftChild()b.刪除子樹DeleteChild();printf(nn c.求右孩子 RightChild
18、()d.結(jié)點賦值A(chǔ)ssign();printf(nn e.求結(jié)點值 Value();printf(nn);voidProduce(char *str)/ 用隨機數(shù)產(chǎn)生二叉樹層次字符序列/使所有節(jié)點的字符不相同,空節(jié)點用&表示intexist27 , i , elem, maxnodes = rand()%41;while( maxnodes 31) maxnodes = rand()%41; /* 隨機產(chǎn)生一個 大于 15 小于 31 的隨機數(shù)作為結(jié)點個數(shù) */for(i = 0; i 27 ;i+) existi = 0;/初始化存在數(shù)組,用于使所有結(jié)點值不同i = 1;while(i ma
19、xnodes)elem = rand() % 26 ;if(!existelem & stri/2 != &) /結(jié)點未生成且存在父節(jié)點文案大全實用標準文檔stri+ = elem + A;existelem = 1;else stri+ = &;stri = 0;頭文件 :base.h:#includestdio.h#includeconio.h#includestdlib.h#includewindows.h#includemalloc.h#includemath.h#defineOK1#defineTRUE1#defineERROR0#defineFALSE0#defineMAXSIZE
20、100typedefintStatus;typedefcharTElemType;shortwherex()/返回光標的 x 坐標shortwherey()/ 返回光標的y 坐標void gotoxy(short x,short y)/ 移動光標到(x, y)坐標COORD point = x, y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point);文案大全實用標準文檔void ClearLine(unsigned y = 17)/ 清除第 y 行與 y+1 行的字符,并使光標在行首,默認清除第17至19行for(
21、int i = 0;i 256;i+)gotoxy(i,y);putchar( );gotoxy(0,wherey()-3);void ClearAera(unsigned x = 96, unsigned y = 17)/ 清除 (0,y)-(x,y+1)區(qū)域的字符,并使光標移動到y(tǒng)for(unsigned i = 0; ilchild);/刪除左子樹DestroyBiTree(T-rchild);/刪除右子樹free(T);T = NULL;return OK;StatusCreateBiTree(BiTree &T)/先序建立二叉樹T, 空格表示空結(jié)點TElemType ch;fflus
22、h(stdin);ch=getche();if(ch = ) T = NULL;elseT = (BiTree)malloc(sizeof(BiTNode);if(!T) exit(OVERFLOW);T-data = ch;/生成頭結(jié)點CreateBiTree(T-lchild);/構(gòu)造左子樹CreateBiTree(T-rchild);/構(gòu)造右子樹return OK;StatusCreateBiTree(BiTree &T,char *str,unsigned i = 1)/ str儲存著二叉樹的層次序列,stri=&表示結(jié)點不存在/ i 為當前要創(chuàng)建結(jié)點對應的數(shù)組序號節(jié)點/由字符數(shù)組st
23、r先序建立一棵二叉樹Tif(stri = & | i = strlen(str) T = NULL; /第 i 個結(jié)點不存在elseT = (BiTree)malloc(sizeof(BiTNode);if(!T) exit(OVERFLOW);T-data = stri;/生成根節(jié)點CreateBiTree(T-lchild, str, i*2);/構(gòu)造左子樹CreateBiTree(T-rchild, str, i*2+1);/構(gòu)造右子樹return OK;文案大全實用標準文檔StatusBiTreeEmpty(BiTree T)/若 T 為空二叉樹,則返回TRUE,否則返回FALSEif
24、(!T)return TRUE;elsereturn FALSE;intBiTreeDepth(BiTree T)/ 返回 T 的深度/ 利用層次遍歷求深度if(!T) return 0;BiTreequeue200;int dep =0;intrear = 0 ,front = 0;queuerear+ = T;while(rear != front)T = queuefront+;if(T-data)dep+;if(T-lchild) queuerear+ = T-lchild;if(T-rchild) queuerear+ = T-rchild;else dep-;return dep;
25、TElemTypeValue(BiTree T,int&k)/ 返回二叉樹先序遍歷第 k 個節(jié)點的值,不存在則返回空格 if(!T | k data;BiTree stack100,p = T;/定義數(shù)組棧inttop = 0 ,i=-1;/初始化棧頂指針while(p | top 0 )/當結(jié)點不空或棧不空if(p)文案大全實用標準文檔i+;if(i=k)return p-data;stacktop+ = p;/根指針入棧,遍歷左子樹p = p-lchild;else/根指針退棧,遍歷右子樹p = stack-top;p = p-rchild;voidAssign(BiTree T,BiTr
26、ee &p,TElemType value)/ 二叉樹 T 存在, e 是 T 中某個結(jié)點/ 結(jié)點 p 賦值為 valueif(p) p-data = value;BiTreeLeftChild(BiTree T,BiTree p)/ 返回 p 的左孩子。若 p 無左孩子,則返回“空”return p-lchild;BiTreeRightChild(BiTree T,BiTree p)/ 返回 p 的右孩子。若 p 無右孩子,則返回“空”return p-rchild;StatusInsertChild(BiTree &T,BiTree &p,int LR,BiTree &c)/二叉樹 T 存
27、在, p 指向 T 中某個結(jié)點,LR 為 0 或 1,非空二叉樹c 與 T 不相交且右子樹為空。/根據(jù) LR為 0 或 1,插入 c 為 T 中 p 所指向結(jié)點的左或右子樹。/ p所指結(jié)點的原有左或右子樹則成為c 的右子樹。if( !T | !c | !p | (LR != 0 & LR != 1)return ERROR;/不符合條件if(LR =0 )/插入為左子樹c-rchild = p-lchild;p-lchild = c;文案大全實用標準文檔if(LR = 1)/插入為右子樹c-rchild = p-rchild;p-rchild = c;return OK;StatusDelet
28、eChild(BiTree &T,BiTree &p,int LR)/ p指向 T 中某個結(jié)點,LR 為 0 或 1./用隊列,根據(jù)LR 為 0 或 1,刪除 T 中 P 所指結(jié)點的左或右子樹if(!T | !p | (LR != 1 & LR != 0)return ERROR;BiTreequeue200;/定義數(shù)組隊列intrear = 0, front = 0 ;/初始化隊列的頭指針和尾指針if(LR = 0 & p-lchild)/ LR為 0 且所刪除左孩子存在queuerear+ = p-lchild;/則左孩子入隊p-lchild = NULL;if(LR = 1 & p-rc
29、hild)/ LR為 1 且所刪除右孩子存在queuerear+ = p-rchild;/則右孩子入隊p-rchild = NULL;while(rear != front)/用隊列層次遍歷,刪除所要求的子樹p = queuefront+;if(p-lchild) queuerear+ = p-lchild;if(p-rchild) queuerear+ = p-rchild;free(p);return OK;StatusPreOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/非遞歸先序遍歷二叉樹。對每個節(jié)點調(diào)用Visit函數(shù)BiTree
30、 stack100,p = T;/定義數(shù)組棧inttop = 0 ;/初始化棧頂指針文案大全實用標準文檔while(p | top 0 )/當結(jié)點不空或棧不空if(p)if(!Visit(p-data)/訪問根節(jié)點return ERROR;stacktop+ = p;/根指針入棧,遍歷左子樹p = p-lchild;else/根指針退棧,遍歷右子樹p = stack-top;p = p-rchild;return OK;StatusInOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/非遞歸中序遍歷二叉樹,對每個節(jié)點調(diào)用Visit。BiTr
31、ee stack100,p = T;/定義數(shù)組棧inttop = 0 ;/初始化棧頂指針while(p | top 0 )if(p)/根指針入棧,遍歷左子樹stacktop+ = p;p = p-lchild;else/根指針退棧,遍歷右子樹p = stack-top;if(!Visit(p-data)return ERROR;p = p-rchild;return OK;StatusPostOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/用棧非遞歸后序遍歷二叉樹T。/與非遞歸先序中序的區(qū)別在于,多定義一visited數(shù)組,用來記錄訪問次
32、數(shù)/ 第二次訪問時才退棧。文案大全實用標準文檔BiTreestack100 , p = T;/定義數(shù)組棧inttop = 0, visited100;/初始化棧頂指針與訪問次數(shù)數(shù)組while(p | top 0)if(p)/遍歷左子樹,置訪問數(shù)組為第一次訪問stacktop+ = p;visitedtop-1 = 0;p = p-lchild;elseif(visitedtop-1 = 0)/若棧頂結(jié)點只訪問一次,遍歷右子樹p = stacktop-1;visitedtop-1 +;p = p-rchild;else if(visitedtop-1 = 1)/若第二次訪問,則根指針退棧,訪問根節(jié)點。if(!Visit(stack-top-data) return ERROR;return OK;StatusLevelOrderTraverse(BiTree T,Status (*Visit)(TElemType e)/用隊列層次遍歷二叉樹T。/對每個結(jié)點調(diào)用函數(shù)Visit一次且僅一次。一旦visit()失敗,則操作失敗if(!T)return OK;BiTreequeue200;/定義數(shù)組隊列intrear = 0 ,front = 0;/初始化隊頭、隊尾指針queuerear+ = T;/根
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報參考:健康中國視域下醫(yī)療、醫(yī)保、醫(yī)藥協(xié)同發(fā)展研究
- 二零二五版房屋互換及社區(qū)活動組織服務(wù)協(xié)議3篇
- 2025年度農(nóng)業(yè)用地承包經(jīng)營權(quán)登記合同參考4篇
- 2025年版?zhèn)€人與投資公司信貸合作借款合同樣本4篇
- 二零二五版木工支模與智能家居安裝服務(wù)合同4篇
- 二零二五版智能家居產(chǎn)業(yè)股權(quán)投資及合作生產(chǎn)合同3篇
- 二零二五年度廚房設(shè)備節(jié)能改造與評估合同8篇
- 2025年度個人與個人草原生態(tài)補償資金管理合同范本4篇
- 2025年新型建筑材料采購及安裝施工合同3篇
- 二零二五年度品牌產(chǎn)品售后服務(wù)客戶關(guān)系維護合同3篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護導體
- 計劃合同部部長述職報告范文
- 人教版高一地理必修一期末試卷
- GJB9001C質(zhì)量管理體系要求-培訓專題培訓課件
- 二手車車主寄售協(xié)議書范文范本
- 2024年中考政治總復習初中道德與法治知識點總結(jié)(重點標記版)
- 2024年手術(shù)室的應急預案
- 五年級上冊小數(shù)除法豎式計算練習300題及答案
- 語言規(guī)劃講義
- 生活用房設(shè)施施工方案模板
- GB/T 9755-2001合成樹脂乳液外墻涂料
評論
0/150
提交評論