版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 信息科學(xué)與技術(shù)學(xué)院</b></p><p> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p> 目 錄</p><p> 1、課程設(shè)計(jì)的目的、課程設(shè)計(jì)題目、題目要求2</p><p> 1.1課程設(shè)計(jì)的目的3</p><p> 1.2課程設(shè)計(jì)的題目
2、3</p><p><b> 1.3題目要求3</b></p><p> 2課程設(shè)計(jì)的實(shí)驗(yàn)報(bào)告內(nèi)容:4</p><p> 3課程設(shè)計(jì)的原程序代碼:4</p><p><b> 4運(yùn)行結(jié)果16</b></p><p> 5. 課程設(shè)計(jì)總結(jié)21</p&g
3、t;<p><b> 6參考書(shū)目22</b></p><p><b> 1課程設(shè)計(jì)的目的</b></p><p> 1.1課程設(shè)計(jì)的目的:</p><p> 通過(guò)以前的學(xué)習(xí)以及查看相關(guān)資料,按著題目要求編寫(xiě)程序,進(jìn)一步加強(qiáng)對(duì)編程的訓(xùn)練,使得自己掌握一些將書(shū)本知識(shí)轉(zhuǎn)化為實(shí)際應(yīng)用當(dāng)中.在整個(gè)程序中,主要
4、應(yīng)用的是鏈表,但是也運(yùn)用了類.通過(guò)兩種方法解決現(xiàn)有問(wèn)題.</p><p> 1.2課程設(shè)計(jì)的題目: 二叉樹(shù)的應(yīng)用</p><p><b> 1.3題目要求:</b></p><p> 建立二叉樹(shù)的二叉鏈表存儲(chǔ)算法</p><p> 二叉樹(shù)的先序遍歷,中序遍歷和后序遍歷輸出</p><p>
5、 非遞歸的先序遍歷,中序遍歷</p><p><b> 二叉樹(shù)的層次遍歷</b></p><p> 判斷此二叉樹(shù)是否是完全二叉樹(shù)</p><p> 二叉樹(shù)的左右孩子的交換</p><p> 2課程設(shè)計(jì)的實(shí)驗(yàn)報(bào)告內(nèi)容:</p><p> 通過(guò)遞歸對(duì)二叉樹(shù)進(jìn)行遍歷。二叉樹(shù)的非遞歸遍歷主要采
6、用利用隊(duì)進(jìn)行遍歷。此后的判斷此二叉樹(shù)是否是完全二叉樹(shù)也才采用隊(duì),而二叉樹(shù)的左右孩子的交換則采用的是一個(gè)簡(jiǎn)單的遞歸。</p><p> 3課程設(shè)計(jì)的原程序代碼:</p><p> #include<iostream></p><p> using namespace std;</p><p> #define MAXSIZE
7、 100</p><p> int sign=0;</p><p> void menu();</p><p><b> //</b></p><p> typedef struct BiTNode</p><p><b> {</b></p><
8、;p> char data;</p><p> BiTNode *left_child,*right_child;</p><p> }BiTNode,*BiTree;</p><p> int CreateBiTree(BiTree &T)//創(chuàng)建二叉樹(shù)</p><p> { char ch;</p>
9、<p> cout<<"請(qǐng)輸入數(shù)據(jù)(#為結(jié)束): ";</p><p><b> cin>>ch;</b></p><p> if(ch=='#') T=NULL;</p><p><b> else</b></p><
10、p><b> { </b></p><p> if(!(T=new BiTNode)){ </p><p> cout<<"Overflow!";//no alloction</p><p><b> return 0;</b></p><p>
11、<b> }</b></p><p> T->data=ch;</p><p> CreateBiTree(T->left_child);//create leftchild</p><p> CreateBiTree(T->right_child); //create rightchild</p>
12、<p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><p> //判斷此樹(shù)是否是完全二叉樹(shù)</p><p> int LevelOrder1(BiTree &T)<
13、/p><p><b> {</b></p><p> BiTree stack[MAXSIZE];</p><p><b> BiTreep;</b></p><p> int front,rear;</p><p> front=-1,rear=0;</p&
14、gt;<p> stack[rear]=T;</p><p> while(rear!=front)</p><p><b> {</b></p><p> front++;</p><p> p=stack[front];</p><p> if((p->
15、left_child==NULL)&&(p->right_child))</p><p> sign=1;</p><p> if(p->left_child)</p><p><b> {</b></p><p><b> rear++;</b></
16、p><p> stack[rear]=p->left_child;</p><p><b> }</b></p><p> if(p->right_child)</p><p><b> {</b></p><p><b> rear++;<
17、/b></p><p> stack[rear]=p->right_child;</p><p><b> }</b></p><p><b> }</b></p><p><b> return 1;</b></p><p>&l
18、t;b> }</b></p><p> void Output(BiTree &T) //輸出二叉樹(shù)</p><p><b> {</b></p><p><b> if(!T) {</b></p><p> cout<<"空樹(shù)!\n&qu
19、ot;;</p><p><b> return ;</b></p><p> } //空樹(shù)</p><p> cout<<T->data<<" ";// 輸出根結(jié)點(diǎn)</p><p> if(T->left_child)
20、Output(T->left_child); //輸出左子樹(shù)</p><p> if(T->right_child)Output(T->right_child);//輸出右子樹(shù)</p><p><b> }</b></p><p> int Depth(BiTree &T) //求樹(shù)深</p>&l
21、t;p><b> {</b></p><p><b> int i,j;</b></p><p> if(!T) return 0;</p><p> i = Depth(T->left_child);</p><p> j = Depth(T->right_child)
22、;</p><p> return (i>j?i:j) + 1;</p><p><b> }</b></p><p> int Node(BiTree &T)//求結(jié)點(diǎn)數(shù)</p><p><b> {</b></p><p> if(!T) retu
23、rn 0;</p><p> return 1+Node(T->left_child)+Node(T->right_child);</p><p><b> }</b></p><p> int Leaf(BiTree &T) //求葉子結(jié)點(diǎn)</p><p><b> {</b
24、></p><p> if(!T) return 0;</p><p> if(!T->left_child&&!T->right_child) return 1;//僅有根結(jié)點(diǎn)</p><p> return Leaf(T->left_child)+Leaf(T->right_child);//返回葉子結(jié)點(diǎn)的數(shù)目
25、</p><p><b> }</b></p><p> void PreOrder(BiTree &T) //先序遍歷算法 DLR</p><p><b> {</b></p><p> if(!T) return ; //遞歸調(diào)用的結(jié)束條件</p><p>
26、; cout<<T->data<<" "; // 訪問(wèn)根結(jié)點(diǎn)的數(shù)據(jù)域</p><p> PreOrder(T->left_child);//先序遞歸遍歷T的左子樹(shù)</p><p> PreOrder(T->right_child);//先序遞歸遍歷T的右子樹(shù)</p><p><b> }
27、</b></p><p> void InOrder(BiTree &T)//中序遍歷算法 LDR</p><p><b> {</b></p><p> if(!T) return ;</p><p> InOrder(T->left_child);</p><p&
28、gt; cout<<T->data<<" ";</p><p> InOrder(T->right_child);</p><p><b> }</b></p><p> void PostOrder(BiTree &T)//后序遍歷算法 LRD</p>&l
29、t;p><b> {</b></p><p> if(!T) return ;</p><p> PostOrder(T->left_child);</p><p> PostOrder(T->right_child);</p><p> cout<<T->data<&
30、lt;" ";</p><p><b> }</b></p><p><b> //非遞歸先序遍歷</b></p><p> int NRPreOrder(BiTree &T)</p><p> {BiTree stack[100],p;</p>&
31、lt;p><b> int top;</b></p><p> if(T==NULL)</p><p><b> return 1;</b></p><p><b> top=-1;</b></p><p><b> p=T;</b><
32、;/p><p> while(!(p==NULL&&top==-1)){</p><p> while(p!=NULL){</p><p> cout<<p->data<<" ";</p><p> if(top<100-1)</p><p>
33、<b> {</b></p><p><b> top++;</b></p><p> stack[top]=p;</p><p><b> }</b></p><p><b> else{</b></p><p> c
34、out<<"棧溢出"<<endl;</p><p><b> return 0;</b></p><p><b> }</b></p><p> p=p->left_child;</p><p><b> }</b>&l
35、t;/p><p> if(top==-1)</p><p><b> return 1;</b></p><p><b> else{</b></p><p> p=stack[top];</p><p><b> top--;</b></p
36、><p> p=p->right_child;</p><p><b> }</b></p><p><b> }</b></p><p> return 1;}</p><p><b> //非遞歸中序遍歷</b></p>&
37、lt;p> int NRInOrder(BiTree &T)</p><p> {BiTree stack[100],p;</p><p><b> int top;</b></p><p> if(T==NULL)</p><p><b> return 1;</b><
38、;/p><p><b> top=-1;</b></p><p><b> p=T;</b></p><p> while(!(p==NULL&&top==-1)){</p><p> while(p!=NULL){</p><p> if(top<
39、;100-1)</p><p><b> {</b></p><p><b> top++;</b></p><p> stack[top]=p;</p><p><b> }</b></p><p><b> else{</b
40、></p><p> cout<<"棧溢出"<<endl;</p><p><b> return 0;</b></p><p><b> }</b></p><p> p=p->left_child;</p><p
41、><b> }</b></p><p> if(top==-1)</p><p><b> return 1;</b></p><p><b> else{</b></p><p> p=stack[top];</p><p> cou
42、t<<p->data<<" ";</p><p><b> top--;</b></p><p> p=p->right_child;</p><p><b> }</b></p><p><b> }</b>&l
43、t;/p><p> return 1;}</p><p><b> //層次遍歷</b></p><p> void LevelOrder(BiTree &T)</p><p> {BiTree queue[100];</p><p> int front,rear;</p&g
44、t;<p> if(T==NULL)</p><p><b> return;</b></p><p><b> front=-1;</b></p><p><b> rear=0;</b></p><p> queue[rear]=T;</p&g
45、t;<p> while(front!=rear){</p><p><b> front++;</b></p><p> cout<<queue[front]->data<<" ";</p><p> if(queue[front]->left_child!=NUL
46、L){</p><p><b> rear++;</b></p><p> queue[rear]=queue[front]->left_child;</p><p><b> }</b></p><p> if(queue[front]->right_child!=NULL)&
47、lt;/p><p><b> {</b></p><p><b> rear++;</b></p><p> queue[rear]=queue[front]->right_child;</p><p><b> }</b></p><p>&
48、lt;b> }</b></p><p><b> }</b></p><p> //*******************************左右子樹(shù)交換*****************************</p><p> /*將結(jié)點(diǎn)的左右子樹(shù)交換*/</p><p> /*BiT
49、Node *swap(BiTNode &T)</p><p><b> { </b></p><p> BiTNode *t,*t1,*t2; </p><p> if(T==NULL) t=NULL; </p><p><b> else </b></p><p
50、><b> { </b></p><p> t=(BiTNode *)malloc(sizeof(BiTNode)); </p><p> t->data=T->data; </p><p> t1=swap(T->left_child); </p><p> t2=swap(T->
51、;right_child); </p><p> t->left_child=t2; </p><p> t->right_child=t1; </p><p><b> } </b></p><p> return(t); </p><p><b> }<
52、/b></p><p> void print(BiTNode &T) </p><p><b> { </b></p><p> if(T!=NULL) </p><p><b> { </b></p><p> printf("%
53、c",T->data); </p><p> if(T->left_child!=NULL||T->right_child!=NULL) </p><p><b> { </b></p><p> printf("("); </p><p> print(b
54、->left_child); </p><p> if(b->right_child!=NULL)printf(", "); </p><p> print(b->right_child); </p><p> printf(")"); </p><p><b>
55、; } </b></p><p><b> } </b></p><p><b> }*/</b></p><p> int PreOrderTraverse(BiTree T)</p><p><b> { </b></p><
56、p><b> if(!T)</b></p><p><b> return 0;</b></p><p><b> BiTree t;</b></p><p> if (T->left_child||T->right_child) </p><p>
57、<b> {</b></p><p> t=T->left_child;</p><p> T->left_child=T->right_child;</p><p> T->right_child=t;</p><p><b> }</b></p>
58、<p> PreOrderTraverse(T->left_child);</p><p> PreOrderTraverse(T->right_child);</p><p><b> return 0;</b></p><p><b> }</b></p><p>
59、;<b> //菜單</b></p><p> void menu()</p><p> { cout<<"*****************************************************************************"<<endl;</p><p>
60、 cout<<"<< (主菜單) >>"<<endl;</p><p> cout<<"********************************************************
61、*********************"<<endl;</p><p> cout<<"<< 0.建立二叉樹(shù) >>"<<endl;</p><p> cout<<&
62、quot;<< 1.二叉樹(shù)樹(shù)深 >>"<<endl;</p><p> cout<<"<< 2.二叉樹(shù)結(jié)點(diǎn)數(shù)
63、 >>"<<endl;</p><p> cout<<"<< 3.二叉樹(shù)的葉子結(jié)點(diǎn) >>"<<endl;</p><p> cout<<"<<
64、; 4.二叉樹(shù)的先序遍歷 >>"<<endl;</p><p> cout<<"<< 5.二叉樹(shù)的中序遍歷 >>"
65、;<<endl;</p><p> cout<<"<< 6.二叉樹(shù)的后序遍歷 >>"<<endl;</p><p> cout<<"<<
66、 7.二叉樹(shù)的非遞歸先序遍歷 >>"<<endl;</p><p> cout<<"<< 8.二叉樹(shù)的非遞歸中序遍歷 >>"<<endl;</p>
67、;<p> cout<<"<< 9.二叉樹(shù)的層次遍歷 >>"<<endl;</p><p> cout<<"<< 10.判斷
68、此樹(shù)是否是完全二叉樹(shù) >>"<<endl;</p><p> cout<<"<< 11.左右孩子交換 >>"<<endl;</p><p> cout&
69、lt;<"<< 12.退出 >>"<<endl;</p><p> cout<<"************************************************************
70、*****************"<<endl;</p><p><b> }</b></p><p><b> //主函數(shù)</b></p><p> void main()</p><p><b> { </b></p>&l
71、t;p><b> int br,a;</b></p><p><b> BiTree T;</b></p><p> br=CreateBiTree(T);</p><p><b> while(1){</b></p><p><b> menu();
72、</b></p><p> cout<<"請(qǐng)輸入選擇的命令-->";</p><p><b> cin>>a;</b></p><p> if(a>=0||a<=12)</p><p><b> {</b></p
73、><p> switch (a){</p><p><b> case 0:</b></p><p> {cout<<"建立后的二叉樹(shù)為:\n";</p><p> Output(T);</p><p> cout<<endl;}</p>
74、;<p> system("pause");break;</p><p><b> case 1:</b></p><p> cout<<"該樹(shù)的樹(shù)深為: "<<Depth(T)<<endl;</p><p> system("pause
75、");break;</p><p><b> case 2:</b></p><p> cout<<"該樹(shù)的結(jié)點(diǎn)數(shù):"<<Node(T)<<endl;</p><p> system("pause");break;</p><p>
76、;<b> case 3:</b></p><p> cout<<"該樹(shù)的葉子結(jié)點(diǎn)為:"<<Leaf(T)<<endl;</p><p> system("pause");break;</p><p><b> case 4:</b><
77、;/p><p> {cout<<"該樹(shù)以先序遍歷輸出為:\n";</p><p> PreOrder(T);</p><p> cout<<endl;}</p><p> system("pause");break;</p><p><b>
78、 case 5:</b></p><p> {cout<<"該樹(shù)以中序遍歷輸出為:\n";</p><p> InOrder(T);</p><p> cout<<endl;}</p><p> system("pause");break;</p>
79、;<p><b> case 6:</b></p><p> {cout<<"該樹(shù)以后序遍歷輸出為:\n";</p><p> PostOrder(T);</p><p> cout<<endl;}</p><p> system("pause
80、");break;</p><p><b> case 7:</b></p><p> {cout<<"該樹(shù)的非遞歸先序遍歷輸出為:\n";</p><p> NRPreOrder(T);</p><p> cout<<endl;}</p>&l
81、t;p> system("pause");break;</p><p><b> case 8:</b></p><p> {cout<<"該樹(shù)的非遞歸中序遍歷輸出為:\n";</p><p> NRInOrder(T);</p><p> cout&l
82、t;<endl;}</p><p> system("pause");break;</p><p><b> case 9:</b></p><p> {cout<<"該樹(shù)的層次遍歷:\n";</p><p> LevelOrder(T);</p&g
83、t;<p> cout<<endl;}</p><p> system("pause");break;</p><p><b> case 10:</b></p><p><b> {</b></p><p> LevelOrder1(T);&
84、lt;/p><p> if(sign==1)</p><p><b> {</b></p><p> cout<<"這不是一個(gè)完全二叉樹(shù)。"<<endl;</p><p><b> }</b></p><p><
85、b> else </b></p><p> cout<<"這是一個(gè)完全二叉樹(shù)。"<<endl;</p><p><b> //break;</b></p><p><b> }</b></p><p> system("
86、;pause");break;</p><p> case 11:PreOrderTraverse(T);</p><p> cout<<"左右孩子已經(jīng)替換成功"<<endl;break;</p><p> case 12:exit(-1);</p><p><b> }
87、</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 4運(yùn)行結(jié)果:</b></p><p> 4. 1用二叉鏈表創(chuàng)
88、建二叉樹(shù):</p><p><b> 4.2主菜單 </b></p><p> 4.3求二叉樹(shù)樹(shù)深:</p><p> 4.4二叉樹(shù)結(jié)點(diǎn)數(shù):</p><p> 4.5二叉樹(shù)的中序遍歷:</p><p> 4.6二叉樹(shù)的層次遍歷:</p><p> 4.7左右孩子
89、交換:</p><p> 4.8左右孩子交換后的中序遍歷:</p><p> 4.9左右孩子交換后的層次遍歷:</p><p> 5. 課程設(shè)計(jì)總結(jié):此次課程設(shè)計(jì)使我對(duì)書(shū)本的知識(shí)有進(jìn)一步了解。同時(shí)也是我知道自己的一些不足,這次課程設(shè)計(jì)我是在書(shū)本與同學(xué)的幫助下完成的。它并不難,但是我沒(méi)有自己獨(dú)自完成是我的錯(cuò)誤。</p><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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹(shù)的應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)及應(yīng)用
- 《數(shù)據(jù)結(jié)構(gòu)遍歷二叉樹(shù)》課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)的遍歷
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉樹(shù)的操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---計(jì)算二叉樹(shù)高度
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---線索二叉樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--樹(shù)的應(yīng)用_樹(shù)和二叉樹(shù)的轉(zhuǎn)換
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)的相關(guān)操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--二叉樹(shù)的算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----二叉樹(shù)平衡的判定
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-二叉樹(shù)的基本操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之二叉樹(shù)的遍歷
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--二叉排序樹(shù)調(diào)整為平衡二叉樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--按層次遍歷二叉樹(shù)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)之-樹(shù)與二叉樹(shù)的轉(zhuǎn)換
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--二叉樹(shù)生成家譜
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉樹(shù)的遍歷算法集成
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---二叉排序樹(shù)和平衡二叉樹(shù)的判別
- 中根與后根構(gòu)造二叉樹(shù)與二叉樹(shù)的匹配替換-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論