




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、長春建筑學(xué)院?數(shù)據(jù)結(jié)構(gòu)?課程設(shè)計論文基于二叉樹遍歷系統(tǒng)設(shè)計與實現(xiàn)基于二叉樹遍歷系統(tǒng)設(shè)計與實現(xiàn)Binary tree traversal System Design and Implementation年 級: 學(xué) 號: 姓 名: 專 業(yè): 指導(dǎo)老師: 二零一三年十二月摘 要 針對現(xiàn)實世界中許多關(guān)系復(fù)雜的數(shù)據(jù),如人類社會的家譜,各種社會組織機構(gòu),博弈交通等復(fù)雜事物或過程以及客觀世界中廣泛存在的具有分支關(guān)系或?qū)哟翁匦缘膶ο笕绮僮飨到y(tǒng)的文件構(gòu)成、人工智能和算法分析的模型表示以及數(shù)據(jù)庫系統(tǒng)的信息組織形式等,用線性結(jié)構(gòu)難以把其中的邏輯關(guān)系表達出來,必須借助于數(shù)和圖這樣的非線性結(jié)構(gòu),因此在以模擬客觀世界問
2、題,解決客觀世界問題為主要任務(wù)的計算機領(lǐng)域中樹型結(jié)構(gòu)是信息的一種重要組織形式,樹有著廣泛應(yīng)用。在樹型結(jié)構(gòu)的應(yīng)用中又以二叉樹最為常用。二叉樹是一種非常重要的非線性結(jié)構(gòu),所描述的數(shù)據(jù)有明顯的層次關(guān)系,其中的每個元素只有一個前驅(qū),二叉樹是最為常用的數(shù)據(jù)結(jié)構(gòu),它的實際應(yīng)用非常廣泛,二叉樹的遍歷方式有三種,前序遍歷,中序遍歷,后序遍歷,先序遍歷的順序為:NLR 先根結(jié)點,然后左子樹,右子樹;中序遍歷順序為;LNR 先左子樹,然后根結(jié)點,右子樹;后序遍歷順序為:LRN 先左子樹,然后右子樹,根結(jié)點。由前序和中序遍歷,有中序和后序遍歷序列可以唯一確定一棵二叉樹。對于給幾個數(shù)據(jù)的排序或在的幾個數(shù)據(jù)中進行查找,
3、二叉樹均能提供一種十分有效的方法,比方在查找問題上,任何借助于比擬法查找長度為的一個序表的算法,都可以表示成一株二叉樹。反之,任何二叉樹都對應(yīng)一個查找有序表的有效方法根據(jù)樹的數(shù)學(xué)理論,對于算法分析的某些最有啟發(fā)性的應(yīng)用,是與給出用于計算各種類型中不同樹的數(shù)目的公式有關(guān)的。本文對二叉樹以及二叉樹的各種功能做介紹以及寫出一些根本的程序,讓讀者對二叉樹的理解有更好的效果。關(guān)鍵詞:二叉樹; 左子樹; 右子樹AbstractIn many real world of complex data, such as the human society family, social organization,
4、widespread game traffic complex thing or process and the objective world with a branch or level characteristics of the object. If the operating system file analysis, artificial intelligence and algorithm model representation and database information system the form of organization, with a linear str
5、ucture to express the logic relationship among them, must depend on the number and the diagram of such nonlinear structure, so in order to simulate the objective world, solve problems as the main task of the computer field in the tree structure is an important organization form of information, the t
6、ree has a broad application. In the application of tree structure in which the two fork tree is the most commonly used.Two binary tree is a kind of very important nonlinear structure, hiberarchy description of the data, where each element is only a precursor, two fork tree is the most commonly used
7、data structure, its application is very extensive, there are three kinds of two binary tree traversal, preorder traversal, in the traversal, postorder traversal, preorder traversal sequence: NLR to the root node, and then the left subtree, right subtree; in order traversal sequence; LNR before the l
8、eft sub tree, then the root node, the right subtree; after the traversal order: LRN first and then the left subtree, right subtree, root node. By preorder traversal and traversal, with the order and post order traversal sequence can be uniquely identified a two binary tree.For several data sorting o
9、r searching in several data known, two fork tree can provide a very effective method, such as search problems, any by the comparison method to find the length of a sequential algorithm of Table IV, can be expressed as a two fork tree. Conversely, any two fork tree corresponds to an effective method
10、to find the ordered list according to the mathematical theory of tree, for some algorithm analysis of the application of heuristic, is given for the number and different types of tree calculation formula.Various functions of two binary tree and binary tree in this paper two introduces and write some
11、 of the basic procedures, to allow readers to understand the two fork tree has a better effect.Keywords:Two tree; the left subtree; right subtree目 錄摘 要 .IABSTRACT. 第 1 章 緒 論.11.1 設(shè)計目的.11.2 設(shè)計內(nèi)容.11.3 設(shè)計要求.11.4 設(shè)計思想.21.5 系統(tǒng)模塊劃分.21.6 主要功能模塊設(shè)計.2第 2 章 系統(tǒng)總體設(shè)計.32.1 根本理論.32.2 概要設(shè)計.3第 3 章 詳細設(shè)計.43.1 建立二叉樹.43.
12、2 二叉樹的層次遍歷和中序遍歷.43.3 求二叉樹的深度.73.4 將二叉樹中所有結(jié)點的左右子樹相互交換.73.5 求二叉樹中葉子結(jié)點的數(shù)目.9第 4 章 流程分析圖.114.1 流程圖.114.2 主要功能模塊設(shè)計.114.3 模塊設(shè)計.124.4 函數(shù)主要調(diào)用關(guān)系圖.13第 5 章 系統(tǒng)測試.145.1 調(diào)試分析.145.2 實驗結(jié)果.15結(jié) 論.17致 謝.18參考文獻.18第 1 章 緒 論引言:引言: 樹型結(jié)構(gòu)是一類重要的非線性數(shù)據(jù)結(jié)構(gòu),其中一樹和二叉樹最重要。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構(gòu)夠可以用樹來形象表示。樹在計算機領(lǐng)域中也得到了廣泛應(yīng)用,如在編
13、譯程序中,可以用樹來表示源程序的語法結(jié)構(gòu)。二叉樹是一種非線性數(shù)據(jù)結(jié)構(gòu),對它進行操作時總需要對每個數(shù)據(jù)逐一進行操作,這樣就存在一個操作順序問題,由此提出了二叉樹的遍歷操作問題,所謂遍歷二叉樹就是按某種順序訪問二叉樹中某個結(jié)點一次且僅一次的過程,這里的訪問可以是輸出.比擬.更新.查看元素內(nèi)容等各種操作。1.1 設(shè)計目的1.掌握二叉樹結(jié)點結(jié)構(gòu)的建立。 2.掌握先序、中序和后序遍歷的根本操作。1.2 設(shè)計內(nèi)容 利用二叉樹特點和功能實現(xiàn)先序、中序和后序遍歷系統(tǒng)的實現(xiàn),具體功能:輸入、輸出遍歷結(jié)果、先序遍歷、中序遍歷和后序遍歷,并能在屏幕上輸出操作前后的結(jié)果。1.3 設(shè)計要求1.寫出系統(tǒng)需求分析,并建模。
14、 2.編程實現(xiàn),界面友好。 3.輸出操作前后的結(jié)果。4.提供測試報告。1.41.4 設(shè)計思想設(shè)計思想1.建立二叉樹采用一個一個輸入的方式。 2.對二叉樹進中序遍歷采用遞歸函數(shù)和非遞歸函數(shù)分別實現(xiàn)多種遍歷的方式。另外還有層次遍歷,來充分實現(xiàn)本書對樹的遍歷。 3.刪除結(jié)點函數(shù),采用邊查找邊刪除的方式。如果沒有查找到,那么不對樹做任何的修改;如果查找到結(jié)點那么刪除。1.51.5 系統(tǒng)模塊劃分系統(tǒng)模塊劃分 1.二叉樹是一種動態(tài)樹表。 2.開辟一個空間建立一個節(jié)點,逐個參加,逐個建立。 3.利用查找函數(shù),對數(shù)進行插入刪除。 4.利用書中所學(xué)知識進行各種遍歷,包括將所有方法歸并在一起,還要建立查看界面一邊
15、有系統(tǒng)的視覺效果。1.61.6 主要功能模塊設(shè)計主要功能模塊設(shè)計 程序主要設(shè)計了幾個功能:首先是創(chuàng)立二叉排序樹,完成后出現(xiàn)任務(wù)菜單,菜單中設(shè)計了八個模塊:樹狀輸出二叉樹,前序遍歷二叉樹,中序遍歷二叉樹,后序遍歷二叉樹,輸出葉子結(jié)點,輸出葉子結(jié)點個數(shù),輸出二叉樹的深度,退出。第 2 章 系統(tǒng)總體設(shè)計2.1 根本理論1建立二叉樹的操作就是用遞歸算法以先序遍歷的次序從根結(jié)點開始建立一棵二叉樹。(2)利用棧的非遞歸算法對二叉樹進行遍歷,從二叉樹的根結(jié)點開始,自頂向下,同層自左往右訪問樹中的每個結(jié)點,此時,保存結(jié)點的順序和訪問的順序剛好一致。(3)用遞歸算法求出左右子樹的深度。需求分析 :1輸入二叉樹的
16、特殊先序序列,建立二叉樹。2實現(xiàn)二叉樹的層次遍歷和中序遍歷。3求二叉樹的深度。4將二叉樹中所有結(jié)點的左右子樹相互交換。5求二叉樹中葉子結(jié)點的數(shù)目。2.2 概要設(shè)計CreatBinTree(&T):建立一棵二叉樹,Value(T,e):查找值為 e 的二叉樹結(jié)點,并返回該結(jié)點的地址。BinTreeDepth(T):返回二叉樹的深度,Parent(T,e):查找二叉樹 T 中的值為 e 的結(jié)點的雙親,假設(shè)沒有根結(jié)點,那么操作失敗。PreOrderTraverse(T):先序遍歷二叉樹,并輸出結(jié)點序列。InorderTraverse(T):中序遍歷二叉樹,并輸出結(jié)點序列。PostOrderT
17、raverse(T):后序遍歷二叉樹,并輸出結(jié)點序列。 LevelOrderTraverse(T):層次遍歷二叉樹,并輸出結(jié)點序列。說明本程序中用到的所有抽象數(shù)據(jù)類型的定義、主程序的流程以及各程序模塊之間的層次(調(diào)用)關(guān)系。第 3 章 詳細設(shè)計Void CreateBinTree(BinTree&T) /按先序次序輸入二叉樹中結(jié)點的值 /構(gòu)造二叉鏈表表示的二叉樹 T TelemType ch; Scanf(“%c,&ch); If(i=) T=Null; Else T=(BinTree)malloc(sizeof(BinTNode); /生成根結(jié)點 Id(!=T) Exit(0
18、); T-data=ch; CreateBinTree(T-lchild); /構(gòu)造左子樹 CreateBinTree(T-rchild); /構(gòu)造右子樹 Return; 3.2 二叉樹的層次遍歷和中序遍歷中序遍歷模塊以中序為例來說明遍歷Traversal是指沿著某條搜索路線,依次對樹中每個結(jié)點均做一次且僅做一次訪問。訪問結(jié)點所做的操作依賴于具體的應(yīng)用問題。二叉樹共有三個局部組成,即根結(jié)點,根結(jié)點的左子樹,根結(jié)點的右子樹。限定以從左至右方式共有三種遍歷方式,即前序遍歷,中序遍歷,后序遍歷。中序遍歷的原那么:假設(shè)被遍歷的二叉樹為非空,那么依次執(zhí)行如下操作:#include / malloc()等
19、#include / 標(biāo)準輸入輸出頭文件,包括 EOF(=Z 或 F6),NULL 等 #include / atoi(),exit()#include / 數(shù)學(xué)函數(shù)頭文件,包括 floor(),ceil(),abs()等 #define ClearBiTree DestroyBiTree / 清空二叉樹和銷毀二叉樹的操作一樣 typedef struct BiTNode int data; / 結(jié)點的值 BiTNode *lchild,*rchild; / 左右孩子指針BiTNode,*BiTree; int Nil=0; / 設(shè)整型以 0 為空 void visit(int e) prin
20、tf(%d ,e); / 以整型格式輸出 void InitBiTree(BiTree &T) / 操作結(jié)果:構(gòu)造空二叉樹 T T=NULL; void CreateBiTree(BiTree &T) / 算法 6.4:按先序次序輸入二叉樹中結(jié)點的值(可為字符型或整型,在主程中定義), / 構(gòu)造二叉鏈表表示的二叉樹 T。變量 Nil 表示空(子)樹。修改int number;scanf(%d,&number); / 輸入結(jié)點的值 if(number=Nil) / 結(jié)點的值為空 T=NULL;else / 結(jié)點的值不為空 T=(BiTree)malloc(sizeof(B
21、iTNode);/ 生成根結(jié)點 if(!T) exit(OVERFLOW); T-data=number; / 將值賦給 T 所指結(jié)點 CreateBiTree(T-lchild); / 遞歸構(gòu)造左子樹 CreateBiTree(T-rchild); / 遞歸構(gòu)造右子樹 void DestroyBiTree(BiTree &T) / 初始條件:二叉樹 T 存在。操作結(jié)果:銷毀二叉樹 T if(T) / 非空樹 DestroyBiTree(T-lchild); / 遞歸銷毀左子樹,如無左子樹,那么不執(zhí)行任何操作 DestroyBiTree(T-rchild); / 遞歸銷毀右子樹,如無右
22、子樹,那么不執(zhí)行任何操作 free(T); / 釋放根結(jié)點T=NULL; / 空指針賦 0 void PreOrderTraverse(BiTree T,void(*Visit)(int) / 初始條件:二叉樹 T 存在,Visit 是對結(jié)點操作的應(yīng)用函數(shù)。修改算 / 操作結(jié)果:先序遞歸遍歷 T,對每個結(jié)點調(diào)用函數(shù) Visit 一次且僅一次 if(T) / T 不空 Visit(T-data); / 先訪問根結(jié)點 PreOrderTraverse(T-lchild,Visit); / 再先序遍歷左子樹 PreOrderTraverse(T-rchild,Visit); / 最后先序遍歷右子樹
23、void InOrderTraverse(BiTree T,void(*Visit)(int) / 初始條件:二叉樹 T 存在,Visit 是對結(jié)點操作的應(yīng)用函數(shù) / 操作結(jié)果:中序遞歸遍歷 T,對每個結(jié)點調(diào)用函數(shù) Visit 一次且僅一次 if(T) InOrderTraverse(T-lchild,Visit); / 先中序遍歷左子樹Visit(T-data); / 再訪問根結(jié)點 InOrderTraverse(T-rchild,Visit); / 最后中序遍歷右子樹 void PostOrderTraverse(BiTree T,void(*Visit)(int) / 初始條件:二叉樹
24、T 存在,Visit 是對結(jié)點操作的應(yīng)用函數(shù) / 操作結(jié)果:后序遞歸遍歷 T,對每個結(jié)點調(diào)用函數(shù) Visit 一次且僅一次if(T) / T 不空 PostOrderTraverse(T-lchild,Visit); / 先后序遍歷左子樹 PostOrderTraverse(T-rchild,Visit); / 再后序遍歷右子樹 Visit(T-data); / 最后訪問根結(jié)點 void main() BiTree T; InitBiTree(T); / 初始化二叉樹 T printf(按先序次序輸入二叉樹中結(jié)點的值,輸入 0 表示節(jié)點為空, 輸入范例:1 2 0 0 3 0 0n); Cre
25、ateBiTree(T); / 建立二叉樹 T printf(先序遞歸遍歷二叉樹:n); PreOrderTraverse(T,visit); /先序遞歸遍歷二叉樹 T printf(n 中序遞歸遍歷二叉樹:n); InOrderTraverse(T,visit); /中序遞歸遍歷二叉樹 T printf(n 后序遞歸遍歷二叉樹:n); PostOrderTraverse(T,visit); /后序遞歸遍歷二叉樹 T 求二叉樹的深度樹的深度組成該樹各結(jié)點的最大層次Int BinTreeDepth(BinTree T) /初始條件:二叉樹存在 /操作結(jié)果:返回 T 的深度 Int i,j; if
26、 (!T) return 0; /i 為左子樹的深度 i=BinTreeDepth(BinTree T-lchild); /j 為右子樹的深度 J= BinTreeDepth(BinTree T-rchild); Return (ij)?(i+1):(j+1)3.4 將二叉樹中所有結(jié)點的左右子樹相互交換#include #include typedef struct binode int data; struct binode *lchild,*rchild; binode,*bitree; typedef struct bitree elem100; int top; stack; bitr
27、ee creat_bt()/按擴展前序建二叉樹 bitree t;int x; scanf(%d,&x); if (x=0) t=NULL; else t=(bitree)malloc(sizeof(binode); t-data=x; t-lchild=creat_bt(); t-rchild=creat_bt(); return t; void exchange(bitree t) /左、右子樹交換 bitree p; if(t!=NULL) p=t-lchild;t-lchild=t-rchild;t-rchild=p; exchange(t-lchild); exchange(
28、t-rchild); void inorder(bitree bt) /遞歸的中序遍歷 if (bt) inorder(bt-lchild); printf(% d,bt-data);inorder(bt-rchild); main() bitree root; printf(n); printf(建二叉樹,輸入元素:); root=creat_bt(); /*create tree of useing preorder*/ printf(交換前的中序序列是:); inorder(root); exchange(root); printf(n 交換后的中序序列是:); inorder(root
29、); printf(n); return; 3.5 求二叉樹中葉子結(jié)點的數(shù)目#include using namespace std; typedef struct TNode/二叉樹結(jié)構(gòu) char nodeValue;/結(jié)點的值 TNode* left;/左子樹 TNode* right;/右子樹 *BiTree; void CreateBiTree(BiTree &T)/中序遍歷方式創(chuàng)立二叉樹 ,輸入#代表該結(jié)點空 char nodeValue; cin nodeValue; if(nodeValue!=#)/結(jié)點非空 T=new TNode; T-nodeValue=nodeVa
30、lue; CreateBiTree(T-left); CreateBiTree(T-right); else T=NULL; int CountLeaf(BiTree T) static int LeafNum=0;/葉子初始數(shù)目為 0,使用靜態(tài)變量 if(T)/樹非空 if(T-left=NULL&T-right=NULL)/為葉子結(jié)點 LeafNum+;/葉子數(shù)目加 1 else/不為葉子結(jié)點 CountLeaf(T-left);/遞歸統(tǒng)計左子樹葉子數(shù)目 CountLeaf(T-right);/遞歸統(tǒng)計右子樹葉子數(shù)目 return LeafNum; 該模塊功能主要是給用戶提供清晰的
31、可操作界面,易于人機操作,并能很好的調(diào)用其他各模塊,使程序更加優(yōu)化,絲路更加清晰,結(jié)構(gòu)更加明了,提高了程序的實用性。其算法如下: /用來測試的 main 函數(shù),int main() BiTree T; int leafNum; cout請輸入中序遍歷的二叉樹序列(#號代表該結(jié)點為空):如(ABC#DE#G#F#)endl; CreateBiTree(T); leafNum=CountLeaf(T); cout該二叉樹中葉子結(jié)點數(shù)為:leafNumendl; return 0; 第四章 流程分析圖4.1 二叉樹的生成過程二叉樹的生成,采用逐個建立的方式。如下圖: 圖圖 4-14-1 二叉樹建立二
32、叉樹建立4.2 主要功能模塊設(shè)計 程序主要設(shè)計了幾個功能:首先是創(chuàng)立二叉排序樹,完成后出現(xiàn)任務(wù)菜單,菜單中設(shè)計了八個模塊:樹狀輸出二叉樹,前序遍歷二叉樹,中序遍歷二叉樹,后序遍歷二叉樹,輸出葉子結(jié)點,輸出葉子結(jié)點個數(shù),輸出二叉樹的深度,退出。主函數(shù)流程如下:初始化數(shù)組插入頭結(jié)點點空樹添加左子輸添加右孩數(shù)插入插入插入是是否否是是是是 圖圖 4-24-2 主函數(shù)流程圖主函數(shù)流程圖模塊設(shè)計模塊設(shè)計本程序包含三個模塊:主程序模塊、建立二叉樹模塊和工作區(qū)模塊。其調(diào)用關(guān)系如圖 4-3 所示。 主程序模塊建立二叉樹模塊工作區(qū)選擇模塊4-34-3 模塊調(diào)用示意圖模塊調(diào)用示意圖否否否否否是創(chuàng)立二叉排序樹Swit
33、ch()遞歸遍歷Switch(0)Exit(0)退出Switch()刪除結(jié)點Switch()default提示出錯非遞歸遍歷是是是是4.44.4 函數(shù)主要調(diào)用關(guān)系圖函數(shù)主要調(diào)用關(guān)系圖本系統(tǒng) 11 個子程序之間的主要調(diào)用關(guān)系如圖 4-4 所示。圖中數(shù)字是各函數(shù)的編號。10 mainwork()98765423111 main()4-44-4 系統(tǒng)函數(shù)調(diào)用關(guān)系圖系統(tǒng)函數(shù)調(diào)用關(guān)系圖第第 5 章章 系統(tǒng)測試系統(tǒng)測試5.1 調(diào)試分析 1在調(diào)試過程中出現(xiàn)了很屢次的程序錯誤,警告和不能運行。在很屢次的調(diào)試和重新改寫之后,才可以用。 2Visual C+確實是一門需要極其細心和耐心的課程,尤其在程序設(shè)計的過程中不可有一絲的馬虎大意,否那么將會花很大力氣去改正。3.調(diào)試過程中最常見的
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 顧客到店課件
- 順產(chǎn)與剖腹產(chǎn)課件
- 項目級安全教育課件
- 幼兒園教師安全常規(guī)培訓(xùn)
- 光伏車間生產(chǎn)管理培訓(xùn)
- 市政污水管網(wǎng)改造項目經(jīng)濟效益和社會效益分析報告(參考)
- 城鎮(zhèn)污水管網(wǎng)建設(shè)項目運營管理方案(參考模板)
- 城鎮(zhèn)污水管網(wǎng)建設(shè)工程招投標(biāo)方案(范文模板)
- 無人機航拍圖像處理與優(yōu)化
- 屋面工程質(zhì)量通病防治手冊
- 施工現(xiàn)場信息化管理方案
- 2023-2024年6月廣東省普通高中學(xué)業(yè)水平考試化學(xué)試題及答案
- DB11∕512-2017 建筑裝飾工程石材應(yīng)用技術(shù)規(guī)程
- TSG ZF001-2006《安全閥安全技術(shù)監(jiān)察規(guī)程》
- 滬科版(2024新版)八年級全冊物理第一學(xué)期期末學(xué)情評估測試卷(含答案)
- 高中數(shù)學(xué)課堂情景引入經(jīng)典案例
- 招標(biāo)代理過程中與各方的溝通
- 護理質(zhì)量改進計劃書
- 2014電氣裝置安裝工程低壓電器施工及驗收規(guī)范
- (正式版)JBT 11270-2024 立體倉庫組合式鋼結(jié)構(gòu)貨架技術(shù)規(guī)范
- 中醫(yī)治療失眠課件
評論
0/150
提交評論