




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)三名稱:二叉樹(shù) 姓名:高寧鑫學(xué)號(hào):201417525班級(jí):2014175專業(yè):數(shù)學(xué)與應(yīng)用數(shù)學(xué) 指導(dǎo)老師:黃春艷一、實(shí)驗(yàn)?zāi)康?1)掌握二叉樹(shù)的定義和存儲(chǔ)表示,學(xué)會(huì)建一棵二叉樹(shù)的方法(2)掌握二叉樹(shù)的遍歷(前序,中序,后序)采用遞歸和非遞歸方法二、實(shí)驗(yàn)要求(1)建二叉樹(shù)(2)遍歷三、實(shí)驗(yàn)原理(1)利用遞歸原理建立一棵二叉鏈表的二叉樹(shù):為了讓每個(gè)結(jié)點(diǎn)確認(rèn)是否有左右孩子,對(duì)原二叉樹(shù)進(jìn)行擴(kuò)展,將二叉樹(shù)中的每個(gè)結(jié)點(diǎn)的空指針引出一個(gè)虛結(jié)點(diǎn),其值為一個(gè)特定值“.”獲得一個(gè)擴(kuò)展二叉樹(shù),通過(guò)遍歷序列確定一棵二叉樹(shù)。(2)進(jìn)行二叉樹(shù)的遍歷:指從根結(jié)點(diǎn)出發(fā),按照某種次序依次訪問(wèn)二叉樹(shù)中的所有結(jié)點(diǎn),
2、使得每個(gè)結(jié)點(diǎn)被訪問(wèn)一次且僅被訪問(wèn)一次。四、實(shí)驗(yàn)環(huán)境Windows XP系統(tǒng), Vc6軟件五、算法實(shí)現(xiàn)及步驟實(shí)現(xiàn)的主要算法:(1)首先定義二叉樹(shù)的存儲(chǔ)形式,這里使用了二叉鏈表typedef struct Node /創(chuàng)建結(jié)點(diǎn)類型結(jié)構(gòu)體 DataType data; struct Node *LChild; struct Node *RChild; BitNode,*BitTree;(2)建立一個(gè)二叉樹(shù)void CreatBiTree(BitTree *bt) /用擴(kuò)展前序遍歷序列創(chuàng)建二叉樹(shù)如果是當(dāng)前樹(shù)根置為空否則申請(qǐng)一個(gè)新節(jié)點(diǎn)/ char ch; ch=getchar(); if(ch='
3、;.')*bt=NULL; else *bt=(BitTree)malloc(sizeof(BitNode); (*bt)->data=ch; CreatBiTree(&(*bt)->LChild); CreatBiTree(&(*bt)->RChild); (3)建立遞歸方法二叉樹(shù)的前序、中序、后序遍歷void PreOrder(BitTree root) /前序遍歷二叉樹(shù)的遞歸算法 if (root!=NULL) visit(root ->data); PreOrder(root ->LChild); PreOrder(root -&g
4、t;RChild); void InOrder(BitTree root) /中序遍歷二叉樹(shù)的遞歸算法 if (root!=NULL) InOrder(root ->LChild); visit(root ->data); InOrder(root ->RChild); void PostOrder(BitTree root) /后序遍歷求二叉樹(shù)的遞歸算法 if(root!=NULL) PostOrder(root ->LChild); PostOrder(root ->RChild); visit(root ->data); (4)建立非遞歸方法二叉樹(shù)的前
5、序、中序、后序遍歷void preOrder2(BinTree *root) /非遞歸前序遍歷 stack<BinTree*> s;BinTree *p=root; while(p!=NULL|!s.empty() while(p!=NULL) cout<<p->data<<"" s.push(p); p=p->lchild; if(!s.empty() p=s.top(); s.pop(); p=p->rchild;void inOrder2(BinTree *root) /非遞歸中序遍歷 stack<BinTr
6、ee*> s; BinTree *p=root; while(p!=NULL|!s.empty() while(p!=NULL) s.push(p); p=p->lchild; if(!s.empty() p=s.top(); cout<<p->data<<"" s.pop(); p=p->rchild; void postOrder2(BinTree *root) /非遞歸后序遍歷 stack<BTNode*> s; BinTree *p=root; BTNode *temp;while(p!=NULL|!s.e
7、mpty() while(p!=NULL)/沿左子樹(shù)往下搜索,直至出現(xiàn)沒(méi)有左子樹(shù)的結(jié)點(diǎn) BTNode *btn=(BTNode *)malloc(sizeof(BTNode); btn->btnode=p; btn->isFirst=true; s.push(btn); p=p->lchild; if(!s.empty() temp=s.top(); s.pop(); if(temp->isFirst=true) /表示是第一次出現(xiàn)在棧頂 temp->isFirst=false; s.push(temp); p=temp->btnode->rchild
8、; else /第二次出現(xiàn)在棧頂 cout<<temp->btnode->data<<"" p=NULL; 六、實(shí)驗(yàn)結(jié)果遞歸方法的遍歷結(jié)果:非遞歸方法的遍歷結(jié)果:七、心得體會(huì) 通過(guò)這次實(shí)驗(yàn),讓我對(duì)樹(shù)有了更深入的認(rèn)識(shí),不僅再次熟悉了樹(shù)以及二叉樹(shù)的存儲(chǔ)結(jié)構(gòu):順序存儲(chǔ)結(jié)構(gòu),鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu);而且更加清楚二叉樹(shù)的遍歷原理以及三種遍歷方法。在這次實(shí)驗(yàn)中,多次應(yīng)用到了遞歸,這樣讓我進(jìn)一步掌握了遞歸的算法思想。 然而在輸入二叉樹(shù)中的元素時(shí),只能按設(shè)定的前序遍歷的次序輸入合法的結(jié)點(diǎn)的值,不然程序無(wú)法進(jìn)行??偟膩?lái)說(shuō),通過(guò)這次實(shí)驗(yàn),讓我對(duì)樹(shù)有了更多的認(rèn)識(shí),明白書(shū)
9、本上的程序一定要自己去調(diào)試,這樣才能將書(shū)本程序與老師講的內(nèi)容融會(huì)貫通,達(dá)到溫故而知新。主程序源代碼:遞歸方法:#include<stdio.h>#include<stdlib.h>#include <malloc.h>#include <conio.h>typedef int DataType; typedef struct Node /創(chuàng)建結(jié)點(diǎn)類型結(jié)構(gòu)體 DataType data; struct Node *LChild; struct Node *RChild; BitNode,*BitTree;void CreatBiTree(BitTr
10、ee *bt) /用擴(kuò)展前序遍歷序列創(chuàng)建二叉樹(shù)如果是當(dāng)前樹(shù)根置為空否則申請(qǐng)一個(gè)新節(jié)點(diǎn)/ char ch; ch=getchar(); if(ch='.')*bt=NULL; else *bt=(BitTree)malloc(sizeof(BitNode); ( *bt)->data=ch; CreatBiTree(&(*bt)->LChild); CreatBiTree(&(*bt)->RChild); void visit(char ch)/訪問(wèn)根節(jié)點(diǎn) printf("%c",ch); void PreOrder(BitT
11、ree root) /前序遍歷二叉樹(shù)的遞歸算法 if (root!=NULL) visit(root ->data); PreOrder(root ->LChild); PreOrder(root ->RChild); void InOrder(BitTree root) /中序遍歷二叉樹(shù)的遞歸算法 if (root!=NULL) InOrder(root ->LChild); visit(root ->data); InOrder(root ->RChild); void PostOrder(BitTree root) /后序遍歷求二叉樹(shù)的遞歸算法 if(
12、root!=NULL) PostOrder(root ->LChild); PostOrder(root ->RChild); visit(root ->data); void main() BitTree T; int layer; layer=0; printf("請(qǐng)輸入二叉樹(shù)中的元素(以擴(kuò)展前序遍歷序列輸入,其中.代表空子樹(shù)):n"); CreatBiTree(&T); printf("前序遍歷序列為:"); PreOrder(T); printf("n中序遍歷序列為:"); InOrder(T); p
13、rintf("n后序遍歷序列為:"); PostOrder(T);非遞歸方法#include <iostream>#include<string.h>#include<stack>using namespace std;typedef struct node char data; struct node *lchild,*rchild;BinTree;typedef struct node1 BinTree *btnode; bool isFirst;BTNode;void creatBinTree(char *s,BinTree *&a
14、mp;root) /創(chuàng)建二叉樹(shù),s為形如A(B,C(D,E)形式的字符串 int i; bool isRight=false; stack<BinTree*> s1; /存放結(jié)點(diǎn) stack<char> s2; /存放分隔符 BinTree *p,*temp; root->data=s0; root->lchild=NULL; root->rchild=NULL; s1.push(root); i=1; while(i<strlen(s) if(si='(') s2.push(si); isRight=false; else if
15、(si=',') isRight=true; else if(si=')') s1.pop(); s2.pop(); else if(isalpha(si) p=(BinTree *)malloc(sizeof(BinTree); p->data=si; p->lchild=NULL; p->rchild=NULL; temp=s1.top(); if(isRight=true) temp->rchild=p; cout<<temp->data<<"的右孩子是"<<si<
16、<endl; else temp->lchild=p; cout<<temp->data<<"的左孩子是"<<si<<endl; if(si+1='(') s1.push(p); i+; void display(BinTree *root) /顯示樹(shù)形結(jié)構(gòu) if(root!=NULL) cout<<root->data; if(root->lchild!=NULL) cout<<'(' display(root->lchild); i
17、f(root->rchild!=NULL) cout<<',' display(root->rchild); cout<<')' void preOrder2(BinTree *root) /非遞歸前序遍歷 stack<BinTree*> s; BinTree *p=root; while(p!=NULL|!s.empty() while(p!=NULL) cout<<p->data<<"" s.push(p); p=p->lchild; if(!s.empt
18、y() p=s.top(); s.pop(); p=p->rchild; void inOrder2(BinTree *root) /非遞歸中序遍歷 stack<BinTree*> s; BinTree *p=root; while(p!=NULL|!s.empty() while(p!=NULL) s.push(p); p=p->lchild; if(!s.empty() p=s.top(); cout<<p->data<<"" s.pop(); p=p->rchild; void postOrder2(BinTree *root) /非遞歸后序遍歷 stack<BTNode*> s; BinTree *p=root; BTNode *temp; while(p!=NULL|!s.empty() while(p!=NULL) /沿左子樹(shù)一直往下搜索,直至出現(xiàn)沒(méi)有左子樹(shù)的結(jié)點(diǎn) BTNode *btn=(BTNode *)malloc(sizeof(BTNode); btn->btnode=p; b
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- VB語(yǔ)言進(jìn)階試題及答案
- 法學(xué)概論考試的多維分析與試題及答案
- 開(kāi)發(fā)框架使用試題及答案
- 網(wǎng)絡(luò)管理員資格考試的委托試題及答案
- 小學(xué)法律競(jìng)賽試題及答案
- 2025年網(wǎng)絡(luò)管理員考試自測(cè)題目試題及答案
- 醫(yī)療健康專業(yè)人員的數(shù)字培訓(xùn)方案
- 消防總隊(duì)面試題目及答案
- 軟件開(kāi)發(fā)中的法律問(wèn)題試題及答案
- 軟考網(wǎng)絡(luò)管理員試題及答案收集
- 股權(quán)終止合作協(xié)議書(shū)
- 入團(tuán)考試試題及答案大學(xué)
- 2025園林景觀設(shè)計(jì)合同范本
- 2025年北京高考語(yǔ)文三輪復(fù)習(xí)之微寫作
- 阿片類藥物不良反應(yīng)和處置
- 貴港離婚協(xié)議書(shū)模板
- 2025年公安機(jī)關(guān)人民警察基本級(jí)執(zhí)法資格備考題庫(kù)
- 2025保密在線教育培訓(xùn)題庫(kù)(含答案)
- 2.1 充分發(fā)揮市場(chǎng)在資源配置中的決定性作用 課件-高中政治統(tǒng)編版必修二經(jīng)濟(jì)與社會(huì)
- 2024年河南鄭州航空港投資集團(tuán)招聘真題
- 2024年寶應(yīng)縣公安局招聘警務(wù)輔助人員真題
評(píng)論
0/150
提交評(píng)論