數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)二叉樹的遍歷_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)二叉樹的遍歷_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)二叉樹的遍歷_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)二叉樹的遍歷_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)二叉樹的遍歷_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、摘要針對(duì)現(xiàn)實(shí)世界中許多關(guān)系復(fù)雜的數(shù)據(jù),如人類社會(huì)的家譜,各種社會(huì)組織機(jī)構(gòu),博弈交通等復(fù)雜事物或過程以及客觀世界中廣泛存在的具有分支關(guān)系或?qū)哟翁匦缘膶?duì)象如操作系統(tǒng)的文件構(gòu)成、人工智能和算法分析的模型表示以及數(shù)據(jù)庫系統(tǒng)的信息組織形式等,用線性結(jié)構(gòu)難以把其中的邏輯關(guān)系表達(dá)出來,必須借助于數(shù)和圖這樣的非線性結(jié)構(gòu),因此在以模擬客觀世界問題,解決客觀世界問題為主要任務(wù)的計(jì)算機(jī)領(lǐng)域中樹型結(jié)構(gòu)是信息的一種重要組織形式,樹有著廣泛應(yīng)用。在樹型結(jié)構(gòu)的應(yīng)用中又以二叉樹最為常用。二叉樹是一種非常重要的非線性結(jié)構(gòu),所描述的數(shù)據(jù)有明顯的層次關(guān)系,其中的每個(gè)元素只有一個(gè)前驅(qū),二叉樹是最為常用的數(shù)據(jù)結(jié)構(gòu),它的實(shí)際應(yīng)用非常廣泛

2、,二叉樹的遍歷方式有三種,前序遍歷,中序遍歷,后序遍歷,先序遍歷的順序?yàn)椋篘LR先根結(jié)點(diǎn),然后左子樹,右子樹;中序遍歷順序?yàn)?;LNR先左子樹,然后根結(jié)點(diǎn),右子樹;后序遍歷順序?yàn)椋篖RN先左子樹,然后右子樹,根結(jié)點(diǎn)。由前序和中序遍歷,有中序和后序遍歷序列可以唯一確定一棵二叉樹。對(duì)于給幾個(gè)數(shù)據(jù)的排序或在已知的幾個(gè)數(shù)據(jù)中進(jìn)行查找,二叉樹均能提供一種十分有效的方法,比如在查找問題上,任何借助于比較法查找長(zhǎng)度為的一個(gè)序表的算法,都可以表示成一株二叉樹。反之,任何二叉樹都對(duì)應(yīng)一個(gè)查找有序表的有效方法根據(jù)樹的數(shù)學(xué)理論,對(duì)于算法分析的某些最有啟發(fā)性的應(yīng)用,是與給出用于計(jì)算各種類型中不同樹的數(shù)目的公式有關(guān)的。本

3、文對(duì)二叉樹以及二叉樹的各種功能做介紹以及寫出一些基本的程序,讓我們對(duì)二叉樹的理解有更好的效果。關(guān)鍵詞:二叉樹的遍歷;左子樹;右子樹;遞歸I目錄1.問題概述31.1問題描述31.2需求分析31.3設(shè)計(jì)內(nèi)容和要求31.4流程圖及結(jié)構(gòu)圖32.概要設(shè)計(jì)32.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):32.2源程序代碼33.調(diào)試分析33.1調(diào)試中的問題34.測(cè)試結(jié)果3總結(jié)3參考文獻(xiàn)3181.問題概述1.1問題描述創(chuàng)建二叉樹并遍歷 基本要求: 該程序集成了如下功能:(1)二叉樹的建立(2)遞歸和非遞歸先序,中序和后序遍歷二叉樹(3)按層次遍歷二叉樹(4)交換二叉樹的左右子樹(5)輸出葉子結(jié)點(diǎn)(6)遞歸和非遞歸計(jì)

4、算葉子結(jié)點(diǎn)的數(shù)目1.2需求分析分先序遍歷,中序遍歷和后序遍歷三種情況考慮。1. 先序遍歷,當(dāng)二叉樹非空時(shí)按以下順序遍歷,否則結(jié)束操作:1 訪問根結(jié)點(diǎn);2 按先序遍歷規(guī)則遍歷左子樹;3 按先序遍歷規(guī)則遍歷右子樹;2. 中序遍歷,當(dāng)二叉樹非空時(shí)按以下順序遍歷,否則結(jié)束操作:1 按中序遍歷規(guī)則遍歷左子樹;2 訪問根結(jié)點(diǎn);3 按中序遍歷規(guī)3遍歷右子樹。3. 后序遍歷,當(dāng)二叉樹非空時(shí)按以下順序遍歷,否則結(jié)束操作:1 按后序遍歷規(guī)則遍歷左子樹;2 按后序遍歷規(guī)則遍歷右子樹;3 訪問根結(jié)點(diǎn)。1.3設(shè)計(jì)內(nèi)容和要求對(duì)任意給定的二叉樹(頂點(diǎn)數(shù)自定)建立它的二叉鏈表存貯結(jié)構(gòu),并利用棧的五種基本運(yùn)算(清空堆棧、壓棧、

5、彈出、取棧頂元素、判??眨?shí)現(xiàn)二叉樹的先序、中序、后序三種周游,輸出三種周游的結(jié)果。1.4流程圖及結(jié)構(gòu)圖YESYESNONO開始i=0i<nbtreetypenewNodeMultiplexroot=newNodei+結(jié)束是否為空returnroot圖1.1 流程圖 b c d e f a圖1.2二叉鏈表存儲(chǔ)結(jié)構(gòu)模擬圖2.概要設(shè)計(jì)2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):1 二叉樹結(jié)點(diǎn)數(shù)據(jù)類型定義為: template <typename T> struct BiNode  BiNode<T>*rchild

6、,*lchild;/指向左孩子的指針T data;/結(jié)點(diǎn)數(shù)據(jù)信息  2 二叉樹數(shù)據(jù)類型定義為: template <typename T> class BiTree  template <typename T> friend ostream & operator <<(ostream &os ,BiTree<T> &

7、bt); public: BiTree();/無參構(gòu)造函數(shù) BiTree(int m);/有參空構(gòu)造函數(shù) BiTree(T ary,int num,T none);/有參構(gòu)造函數(shù)  BiTree();/析構(gòu)函數(shù) void preorder();/遞歸前序遍歷  void inorder();/遞歸中序遍歷  void postorder();/遞歸后續(xù)遍歷 void levelorder();/層

8、序遍歷 int  count();/計(jì)算二叉樹的結(jié)點(diǎn)數(shù)  void display(ostream &os);/打印二叉樹,有層次  void LevelNum();/計(jì)算每一層結(jié)點(diǎn)數(shù)  void PreOrder();/非遞歸前序遍歷  void PostOrder();/非遞歸后序遍歷  void creat();/創(chuàng)建二叉樹 protected: /以下函數(shù)供上面函數(shù)調(diào)用&

9、#160; /對(duì)應(yīng)相同功能 Voidcreat(BiNode<T>*&root);/創(chuàng)建  void release(BiNode<T>* &root);/刪除 BiNode<T> * Build(T ary,int num,T none,int idx);/用數(shù)組創(chuàng)建二叉樹  void PreOrder(BiNode<T>* root);/前序遍歷 &

10、#160;void PostOrder(BiNode<T>* root);/后續(xù)遍歷  void LevelNum(BiNode<T>* root);/層序遍歷  void preorder(BiNode<T>* root);/遞歸前序遍歷  void inorder(BiNode<T>* root);/遞歸中序遍歷  void postorder(BiNode<T>

11、* root);/遞歸后續(xù)遍歷  void levelorder(BiNode<T>*root);/層序遍歷  int count(BiNode<T>* root);/計(jì)算結(jié)點(diǎn)數(shù)   void display(ostream& os,BiNode<T>* root,int dep);/打印 static bool leastCommanAncestor(BiNode<

12、T> *root, T va, T vb, BiNode<T>                       private:BiNode<T> *rootptr; 2.2源程序代碼#include <iostream>using namespace

13、 std;/*/二叉樹結(jié)點(diǎn)類的定義template<class T>struct BTNodeT data; BTNode <T> * Lchild,*Rchild; BTNode(T nodeValue = T(),BTNode<T>* leftNode = NULL,BTNode<T>* rightNode = NULL ) :data(nodeValue),Lchild(leftNode),Rchild(rightNode) /可選擇參數(shù)的默認(rèn)構(gòu)造函數(shù);/*/二叉樹的建立template <class T>void create

14、BinTree(BTNode<T> * &root ) BTNode<T>* p = root; BTNode<T>* k; T nodeValue ; cin>>nodeValue; if(nodeValue=-1) root=NULL; else root=new BTNode<T>(); root->data = nodeValue; createBinTree(root->Lchild); createBinTree(root->Rchild); /*/二叉樹的先序遍歷template <cla

15、ss T>void preOrder( BTNode<T> * & p) if(p) cout<<p->data<<" " preOrder(p->Lchild); preOrder(p->Rchild); /*/二叉樹的中序遍歷template <class T>void inOrder(BTNode<T> * & p) if(p) inOrder(p->Lchild); cout<<p->data<<" " inOr

16、der(p->Rchild); /*/二叉樹的后序遍歷template <class T>void levelOrder(BTNode<T> *& p) if(p) levelOrder(p->Lchild); levelOrder(p->Rchild); cout<<p->data<<" " /*/統(tǒng)計(jì)二叉樹中結(jié)點(diǎn)的個(gè)數(shù)template<class T>int countNode(BTNode<T> * & p) if(p = NULL) return 0; r

17、eturn 1+countNode(p->Lchild)+countNode(p->Rchild);/*/求二叉樹的深度template<class T>int depth(BTNode<T> *& p) if(p = NULL) return -1; int h1 = depth(p->Lchild); int h2 = depth(p->Rchild); if(h1>h2)return (h1+1); return h2+1;/*/二叉樹的消毀操作template<class T>BTNode<T>* d

18、estroy(BTNode<T>* p) /消毀函數(shù),用來消毀二叉樹中的各個(gè)結(jié)點(diǎn) if(p) return destroy(p->Lchild); return destroy(p->Rchild); delete p; /*/主函數(shù)的設(shè)計(jì) int main () BTNode<int> * rootNode = NULL; int choiced = 0; while(true) system("cls"); cout<<"nnn -主界面-nnn" cout<<" 1、創(chuàng)建二叉樹

19、2、先序遍歷二叉樹n" cout<<" 3、中序遍歷二叉樹 4、后序遍歷二叉樹n" cout<<" 5、統(tǒng)計(jì)結(jié)點(diǎn)總數(shù) 6、查看樹深度 n" cout<<" 7、消毀二叉樹 0、退出nn" cout<<" 請(qǐng)選擇操作:" cin>>choiced; if(choiced = 0) return 0; else if(choiced = 1) system("cls"); cout<<"請(qǐng)輸入每個(gè)結(jié)點(diǎn),回車確

20、認(rèn),并以-1結(jié)束:n" createBinTree(rootNode ); else if(choiced = 2) system("cls"); cout<<"先序遍歷二叉樹結(jié)果:n" preOrder(rootNode); cout<<endl; system("pause"); else if(choiced = 3) system("cls"); cout<<"中序遍歷二叉樹結(jié)果:n" inOrder(rootNode); cout<&

21、lt;endl; system("pause"); else if(choiced = 4) system("cls"); cout<<"后序遍歷二叉樹結(jié)果:n" levelOrder(rootNode); cout<<endl; system("pause"); else if(choiced = 5) system("cls"); int count = countNode(rootNode); cout<<"二叉樹中結(jié)點(diǎn)總數(shù)為"<

22、;<count<<endl; system("pause"); else if(choiced = 6) system("cls"); int dep = depth(rootNode); cout<<"此二叉樹的深度為"<<dep<<endl; system("pause"); else if(choiced = 7) system("cls"); cout<<"二叉樹已被消毀!n" destroy(rootNode); cout<<endl; system("pause"); else system("cls"); cout<<"nnnnnt錯(cuò)誤選擇!n" 3.調(diào)試分析3.1調(diào)試中的問題創(chuàng)建二叉樹:依次輸入二叉樹前序遍歷序列,構(gòu)建相應(yīng)的二叉樹。 二叉樹遍歷:遞歸算法、非遞歸算法測(cè)試,調(diào)用相應(yīng)函數(shù)

溫馨提示

  • 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論