




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
樹和二叉樹實驗報告課程一數(shù)據(jù)結(jié)構(gòu)實驗名稱樹和二叉樹系別.計算機學(xué)院專業(yè)班級軟件134姓名.徐雅欣學(xué)號實驗日期:2023年6月7日實驗?zāi)康模海?)掌握二叉樹,二叉樹排序數(shù)的概念及存儲方法。(二)掌握二叉樹的遍歷算法(三)純熟掌握編寫實現(xiàn)樹的各種運算的算法二.實驗內(nèi)容(-)實驗題目一:建立一棵二叉樹并中序遍歷(填空).要點分析:中序遍歷的遍歷規(guī)則是(前中后),既先訪問左子樹,在訪問當(dāng)前節(jié)點,最后訪問右子樹。.程序源代碼:#include<stdio.h>#include<ma11oc.h>struetnode(?chardata;structnode*lchild,*rchild;}bnode;typedefstructnode*blink;blinkadd(blinkbt,charch){?if(bt==NULL)
■C:\Users\Administrator\Desktop\程序\shiyanwu\Debug逐次遍歷.exe"創(chuàng)建一顆二叉樹<紛表示空:二叉數(shù)層次遍歷為:ABCDEPressanykeytocontinue口X(四)實驗題目4:編寫程序,對二叉樹進行先序遍歷,并打印層號??赬】.要點分析:從二叉樹的遞歸定義可知,一棵非空的二叉樹由根結(jié)點及左、右子樹這三個基本部分組成。因此,在任一給定結(jié)點上,可以按某種順序執(zhí)行三個操作:(1)訪問結(jié)點自身(N),(2)遍歷該結(jié)點的左子樹(L),(3)遍歷該結(jié)點的右子樹(R)。根據(jù)遍歷的原則:先左后右,對于先序遍歷,顧名思義就是先訪問根節(jié)點,再訪問左子樹,最后訪問右子樹,2.程序源代碼:#include<stdio.h>include<std1ib.h>include<mal1oc.h>defineMAXSIZE50typedefcharDataType;structnodeDataTypedata;structnode*lchiId;〃指向左孩子結(jié)點structnode*rchild;//指向右孩子結(jié)點nt1evel;}BitNode;typedefstructnode*BiTree;voidCreateBiTree(BiTree*T)(eDataTypech;ch=getchar();?if(ch=='#')o*T=NULL;?else{*T=(BiTree)mal1oc(sizeof(BitNode));〃生成根節(jié)點aif(!(*T))?exit(-1);。(*T)->data=ch;CrcateBiTree(&(*T)->lchild);//構(gòu)造左子樹CreateBiTree(&(*T)->rchild);//構(gòu)造右子樹}voidPreOrder(BiTreeT,int1eve1)//先序遍歷的遞歸實現(xiàn)Mf(T)。(,sprintf(“為2c%2d\n〃,T->data,1eve1);?PreOrder(T->lchi1d,++level);PreOrder(T—>rchild,leve1);)voidmainO(密訂reeT=NULL;6intlev=1;printf("創(chuàng)建一顆二叉樹:\n");?CreateBiTree(&T);叩rintf('\n");printf("二叉數(shù)先序遍歷及各點相應(yīng)的層號為:\n〃);ogetchar();PreOrder〕,lev);3.實驗結(jié)果:IL-H°IxB二叉數(shù)先序遍歷及各點對應(yīng)的層號為:■B2C2D3E3c:IPressanykeytocontinue(五)實驗題目5:編寫程序,實現(xiàn)二叉樹的先序,中序,后序遍歷,并求深度0.要點分析:了解先序,中序,后序。.程序源代碼:#include<stdio.h>include<std1ib.h>include<malloc.h>#defineMAXSIZE50typedefcharDataType;structnodeDataTypedata;structnode*lchild;//指向左孩子結(jié)點ostructnode*rchi1d;〃指向右孩子結(jié)點}BitNode;typedefstructnode*BiTree;voidCreateBiTree(BiTree*T)DataTypech;ch=getchar();f(ch=='#')o*T=NULL;else?*T=(BiTree)malloc(sizeof(BitNode));//生成根節(jié)點aif(!(*T))。exit(-1);a(*T)—>data=ch;CreateBiTree(&(*T)->lchild);//構(gòu)造左子樹CreateBiTree(&(*T)->rchild);〃構(gòu)造右子樹})voidPreOrder(BiTreeT)〃先序遍歷的遞歸實現(xiàn)(f(T)(0。printfC%2c",T->data);3PreOrder(T->1child);PreOrder(T—>rchiid);voidInOi*der(BiTreeT)//中序遍歷的遞歸實現(xiàn)oif(T)。(InOrder(T->lchiId);printf(“/2c”,T->data);InOrder(T->rchiId);。})voidPostOrder(BiTreeT)〃后序遍歷的遞歸實現(xiàn)(if(T)(。PostOrdcr(T—>lchi1d);PostOrder(T—>rchild);aprintf("%2cM,T->data);}BiTreeFindNode(BiTreeT,DataTypee)〃查找節(jié)點(BiTreep;oifgNULL)returnNULL:elseif(T->data==e)returnT;史Ise(?p=FindNode(T->lchi1d,e);~if(p!=NULL)。?>returnp;。else。oreturnFindNode(T—>rchild,e);。})intBitTreeDepth(BiTreeT)(int1childepth,rchildepth;式f(T==NULL)^return0;e1se{1chiIdepth=BitTrceDcpth(T—>lchild);rchi1deplh=BitTreeDepth(T->rchi1d);。if(Ichildepth>rchildepth)8return(lchiIdepth+1);oe1sereturn(rchildepth+1);voidmain()(BiTreeT=NULL,root:ointh;?DataTypee;叩rintf(〃創(chuàng)建一顆二又樹<#>表達子樹為空:\n");eCreateBiTree(&T);叩rintf("\n");oprintf("二叉數(shù)的先序遍歷為:\n");PreOrder(T);printf('\n");?printf("二叉數(shù)的中序遍歷為:\n");?InOrder(T);printf("\n");叩rintf(〃二叉數(shù)的后序遍歷為:\n〃);?PostOrder(T);?printf(〃\n〃);?h=BitTreeDepth(T);printf("這課二義數(shù)的深度為%d:”,h);egetchar();"rintf(”\n\n輸入要查找節(jié)點:〃);“/scanf&e);e=getchar();root=FindNode(T,e);h=BitTreeDepth(root);PrintfC\n以%c結(jié)點為根的子樹深度為%d:",e,h);3.實驗結(jié)果:'C:\Users\Administrator\Desktop\程序\shiyanwu\Debug選序、中序、,看序且求深度.exe"創(chuàng)建一顆二叉樹“)表示子樹為空:ABttltCDttttEtttt二叉數(shù)的先序遍歷為:ABCDE二叉數(shù)的巾序遍歷為:BADCE二叉數(shù)的后序遍歷為:BDECA這課二叉數(shù)的深度為3:輸入要查找節(jié)點:(六)實驗題目6:編寫遞歸算法,求二叉樹中以元素值為x的結(jié)點為根的子樹的深度。1.要點分析:遞歸過程?般通過函數(shù)或子過程來實現(xiàn)。遞歸方法:在函數(shù)或子過程的內(nèi)逆,直接或者間接地調(diào)用自己的算法。遞歸算法所體現(xiàn)的“反復(fù)”?般有三個規(guī)定:一是每次調(diào)用在規(guī)模上都有所縮?。ㄍǔJ菧p半);二是相鄰兩次反復(fù)之間有緊密的聯(lián)系,前一次要為后一次做準(zhǔn)備(通常前一次的輸出就作為后一次的輸入);三是在問題的規(guī)模極小時必須用直接給出解答而不再進行遞歸調(diào)用,因而每次遞歸調(diào)用都是有條件的(以規(guī)模未達成直接解答的大小為條件),無條件遞歸調(diào)用將會成為死循環(huán)而不能止常結(jié)束。2.程序源代碼:#include"stdio.h"#include'stdlib.h"#inc1ude"string,h'a#definenul1Onstructnode(chardata;astructnode*lchild;astructnode*rchild;);aa//先序,中序建樹astructnode*create(char*pre,char*ord,intn)a{structnode*head;Aintordsit;ahead=nul1;if(n<=0)(returnnu11;a}ae1se(head=(structnode*)malloc(sizeof(structnode));Ahead->data=*pre;Ahead—>lchild二head—>rchiId二null;aordsit=0;while(ord[ordsit]!=*pre){7)rdsil++;a}head—>Ichiid=create(pre+1,ord?ordsit);ead—>rchild=create(pre+ordsit+1,ord+ordsit+1,n-ordsit-1);returnhead:。bt=(blink)ma11oc(sizeof(bnode));bt->data=ch;??bt->lchi1d=bt—>rchild=NULL;}oelseif(ch<bt->data)~bt->lchild=add(bt—>1child,ch);else<4)t->rchild=add(bt->rchild,ch);returnbt;)voidinorder(blinkbt){if(bt)。(。inorder(bt—>Ichi1d);printfC%2c",bt—>data);inorder(bt->rchild);0})main()(blinkroot=NULL;inti,n;charx;seanf("%d*,&n);for(i=0;i<=n;i4-+)//中序遞歸遍歷Avoidinorder(structnode*head){aif(!head)Areturn;acIsea(Ainorder(head->lchiId);printf("%c",head->data);inorder(head->rchi1d);a}}中序非遞歸遍歷voidinorderi(structnode*head)(structnode*p;structnode*stack[20];inttop=0;ap=head;while(p|11op!=0){Awhile(p){Astack[top++]=p;p=p->lchiId;}Ap=stack[-top];printf(飛c”,p->data);ap=p->rchild;}A}a〃主函數(shù)Aintmain()a{astructnode*head;acharpre[30],ord[30];intn;agets(pre);gets(ord);an=str1en(pre);Ahead=create(pre,ord,n);Ainorder(head);
printf("\n");inorder1(head);aprintf("\n");a}3.實驗結(jié)果:在運用程序設(shè)計求解問題實現(xiàn)功能時,我們一方面要對問題進行分析,將所要實現(xiàn)的功能分解成若干子功能來實現(xiàn),這就需要對設(shè)計方法不斷優(yōu)化。隊以同一問題,解決的方法很多,但尋求一個簡樸的方法,一個可以用簡樸的計算機語言語句實驗的方法,才是問題額求解方法設(shè)計的關(guān)鍵。就像本次課程設(shè)計中實現(xiàn)二叉樹樹樁輸出時,有很多方法來擬定二叉樹結(jié)點和數(shù)組的相應(yīng)關(guān)系,但適合計算機的簡樸方法才是最佳最重要的。◎X=getcheir():groot=add(root,x);)inorder(root);?printf("\n"):)3.實驗結(jié)果:皿事丁m7VpE?「二I-口x8ephqsbmaabehmpqsPressanykeytocontinue(二)實驗題目2:編寫程序,求二叉樹的節(jié)點數(shù)和葉子樹。.要點分析:.定理:二叉樹假如有vO個葉子節(jié)點,那么就有v0-1個度為二的節(jié)點就是v0-l=v2a定理:二叉樹有N個節(jié)點N=v0+vl+v2即節(jié)點總數(shù)等于度為0,1,2的節(jié)點的和。.程序源代碼:#include<stdio.h>#inc1ude<ma1loc.h>闔defineERROR0^defineOK1#defineOVERFLOW-2#defineTRUE1typcdefintStatus;AtypedefcharTEIcmType;typedefstructBiTNode{TElemTypedata;structBiTNode*Ichi1d,*rchi1d;(BiTNode,*BiTree:Mntcount=0;AStatusCreateBiTree(BiTree*T){charch;Ascanf("%c”,&ch);if(ch==,')(*T)=NULL;ac1so)Aif(!((*T)=(BiTNode*)ma11oc(sizeof(BiTNode))))^exit(OVERFLOW);^(*T)->data=ch;^CreateBiTree(&((*T)->1chi1d));^CreateBiTree(&((*T)->rchild));}returnOK;}aStatusCountleaf(BiTreeT)(if(T){if((!T->lchild)&&(!T->rchiId))count++;aCountleaf(T->lchi1d);aCountleaf(T->rchild);A)Areturncount;)StatusDepth(BiTreeT){intdepthval,depthleft=0,depthright=0;Aif(!T)depthva1=0;Ae1se{depthleft=Depth(T->lchiId);Mepthright=Depth(T->rchi1d);depthval=l+(depth1eft>depthright?depthleft:depthright);a}returndepthva1;}aStatusPreordcr(BiTrecT)a{if(T)a{printf(“猊",T->data);Preorder(T->1child);Preorder(T->rchild);a})StatusInOrderTraverse(BiTreeT,Status(*Visit)(TE1emTypee))(aStackS;InitStack(S);p=T;Awhile(p=!StackEmpty(S)){Mf(p){Push(S,p);p=p—>lchild;}else{Pop(S,p);if(!Visit(p->data))returnERROR;Ap=p->rchi1(1;a}a}returnOK;}Avoidmain(){BiTreeT;Aprintf("pleaseinputaTree:/,);CreateBiTree(&T);printf("theTreeis:");reorder(T)printfInOrderTraverse(T);printf("\n");Aprintf("thenumberofleavesis:〃)printfCountleaf(T));Pprintf("theDepthofthetreeis:〃);printfDepth(T));petch();△}3.實驗結(jié)果:'C:\Users\Administrator\Desktop\^/?\shiyanwu\Debug\^i5^?^WlH^^.exe'按照先序字符創(chuàng)建一顆二叉樹〈以1t號表示空工ABDttttGHttttIttttCEttttFtttt這舜二叉科的節(jié)點鰲髻:9這楝二叉樹的葉子數(shù)皂5Pressanykeytocontinue(三)實驗題目3:編寫程序,實現(xiàn)按層次遍歷二叉樹。.要點分析:定義:1、滿二叉樹:一棵深度為k且有2的k次方減I個結(jié)點的二叉樹稱為滿二叉樹2、完全二叉樹:假如有深度為k的,有n個結(jié)點的二叉樹,當(dāng)且僅當(dāng)其每一個結(jié)點都與深度為k的滿二叉樹中編號從1至n的結(jié)點一一相應(yīng)時,稱之為完全二叉樹。性質(zhì):I、二叉樹的第i層上至多有2的i—1次方個結(jié)點(i>=1)。2、深度為k的二叉樹至多有2的k次方減1個結(jié)點(k>=l)。、對任何一棵二叉樹T,假如其終端結(jié)點數(shù)為nO,度為2的結(jié)點數(shù)為n2,則n0=n2+1。4、具有n個結(jié)點的完全二叉樹的深度為以2為底n的對數(shù)取下限加1。5a、假如對一棵有n個結(jié)點的完全二叉樹的結(jié)點按層序編號,則對任?結(jié)點i(gvi=vn)有:1(a)假如i=l,則結(jié)點i是二叉樹的根,無雙親;假如i>l,則雙親PARENT(i)是結(jié)點[i/2卜(2)假如2i>n,則結(jié)點i無左孩子(結(jié)點i為葉子結(jié)點);否則其左孩子LCHILD(i)是結(jié)點2i⑶假如2i+l>n,則結(jié)點i無右孩子;否則其右孩子RCHILD(i)是結(jié)點2i+l.存儲結(jié)構(gòu):順序存儲結(jié)構(gòu)(數(shù)組方式),鏈?zhǔn)酱鎯Y(jié)構(gòu)(二叉鏈表).程序源代碼:#include<stdio.h>#include<stdlib.h>include<mal1oc.h>defineMAXS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化學(xué)元素周期表及反應(yīng)試題庫
- 基于地方特色的勞動教育課程實施模式
- DB62-T 3264-2024 綠色裝配式臨時邊坡防護技術(shù)標(biāo)準(zhǔn)
- 2025年中考英語語法課件:狀語從句
- 醫(yī)療器械采購管理制度
- 顧客心理在新零售戰(zhàn)略實施中的作用
- 革新文物修復(fù)流程非接觸科技的力量與前景
- 項目風(fēng)險管理中的數(shù)據(jù)可視化分析
- 顧客旅程設(shè)計提升品牌價值
- 音樂產(chǎn)業(yè)的新媒體營銷策略分析
- 2024年浙江省中考英語試題卷(含答案)
- 翻身拍背護理
- 《火災(zāi)調(diào)查 第2版》 課件 第5-7章 火災(zāi)調(diào)查分析、放火火災(zāi)調(diào)查、電氣火災(zāi)調(diào)查
- 高層建筑火災(zāi)撲救危險識別與應(yīng)對
- 廣播電視節(jié)目評析期末考試資料
- 重慶市沙坪壩區(qū)第八中學(xué)校2023-2024學(xué)年八年級下學(xué)期期末英語試題(解析版)
- 江西省南昌市西湖區(qū)2023-2024學(xué)年五年級下學(xué)期期末數(shù)學(xué)試題
- 上海市徐匯區(qū)2023-2024學(xué)年七年級下學(xué)期數(shù)學(xué)期末練習(xí)卷
- 植物拓染非物質(zhì)文化遺產(chǎn)傳承拓花草之印染自然之美課件
- TD/T 1044-2014 生產(chǎn)項目土地復(fù)墾驗收規(guī)程(正式版)
- 霧化吸入團體標(biāo)準(zhǔn)解讀
評論
0/150
提交評論