數(shù)據(jù)結(jié)構(gòu)與算法實(shí)驗(yàn)報(bào)告-二叉樹.pdf
《數(shù)據(jù)結(jié)構(gòu)與算法實(shí)驗(yàn)報(bào)告-二叉樹.pdf》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)與算法實(shí)驗(yàn)報(bào)告-二叉樹.pdf(27頁珍藏版)》請(qǐng)?jiān)趨R文網(wǎng)上搜索。
1、數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目實(shí)驗(yàn)題目二叉樹的基本操作及運(yùn)算二叉樹的基本操作及運(yùn)算一、一、需要分析需要分析問題描述:?jiǎn)栴}描述:實(shí)現(xiàn)二叉樹(包括二叉排序樹)的建立,并實(shí)現(xiàn)先序、中序、后序和按層次遍歷,計(jì)算葉子結(jié)點(diǎn)數(shù)、樹的深度、樹的寬度,求樹的非空子孫結(jié)點(diǎn)個(gè)數(shù)、度為 2 的結(jié)點(diǎn)數(shù)目、度為 2 的結(jié)點(diǎn)數(shù)目,以及二叉樹常用運(yùn)算。問題分析:?jiǎn)栴}分析:二叉樹樹型結(jié)構(gòu)是一類重要的非線性數(shù)據(jù)結(jié)構(gòu),對(duì)它的熟練掌握是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的基本要求。由于二叉樹的定義本身就是一種遞歸定義,所以二叉樹的一些基本操作也可采用遞歸調(diào)用的方法。處理本問題,我覺得應(yīng)該:第 1 頁 共 27 頁1、建立二叉樹;
2、2、通過遞歸方法來遍歷(先序、中序和后序)二叉樹;3、通過隊(duì)列應(yīng)用來實(shí)現(xiàn)對(duì)二叉樹的層次遍歷;4、借用遞歸方法對(duì)二叉樹進(jìn)行一些基本操作,如:求葉子數(shù)、樹的深度寬度等;5、運(yùn)用廣義表對(duì)二叉樹進(jìn)行廣義表形式的打印。算法規(guī)定:算法規(guī)定:輸入形式:為了方便操作,規(guī)定二叉樹的元素類型都為字符型,允許各種字符類型的輸入,沒有元素的結(jié)點(diǎn)以空格輸入表示,并且本實(shí)驗(yàn)是以先序順序輸入的。輸出形式:通過先序、中序和后序遍歷的方法對(duì)樹的各字符型元素進(jìn)行遍歷打印,再以廣義表形式進(jìn)行打印。對(duì)二叉樹的一些運(yùn)算結(jié)果以整型輸出。程序功能:實(shí)現(xiàn)對(duì)二叉樹的先序、中序和后序遍歷,層次遍歷。計(jì)算葉子結(jié)點(diǎn)數(shù)、樹的深度、樹的寬度,求樹的非空
3、子孫結(jié)點(diǎn)個(gè)數(shù)、度為 2 的結(jié)點(diǎn)數(shù)目、度為 2 的結(jié)點(diǎn)數(shù)目。對(duì)二叉樹的某個(gè)元素進(jìn)行查找,對(duì)二叉樹的某個(gè)結(jié)點(diǎn)進(jìn)行刪除。測(cè)試數(shù)據(jù):測(cè)試數(shù)據(jù):輸 入 一:ABCDEGF(以表示空格),查找 5,刪除 E預(yù)測(cè)結(jié)果:先序遍歷 ABCDEGF中序遍歷 CBEGDFA后序遍歷 CGEFDBA層次遍歷 ABCDEFG廣義表打印 A(B(C,D(E(,G),F)葉子數(shù) 3 深度 5 寬度 2 非空子孫數(shù) 6度為 2 的數(shù)目 2 度為 1 的數(shù)目 2查找 5,成功,查找的元素為E刪除 E 后,以廣義表形式打印A(B(C,D(,F)輸 入 二:ABDEHCFG(以表示空格),查找 10,刪除 B預(yù)測(cè)結(jié)果:先序遍歷 A
4、BDEHCFG中序遍歷 DBHEAGFC后序遍歷 DHEBGFCA層次遍歷 ABCDEFHG廣義表打印 A(B(D,E(H),C(F(,G))葉子數(shù) 3 深度 4 寬度 3 非空子孫數(shù) 7度為 2 的數(shù)目 2 度為 1 的數(shù)目 3查找 10,失敗。第 2 頁 共 27 頁刪除 B 后,以廣義表形式打印A(,C(F(,G)二、二、概要設(shè)計(jì)概要設(shè)計(jì)程序中將涉及下列兩個(gè)抽象數(shù)據(jù)類型:一個(gè)是二叉樹,一個(gè)是隊(duì)列。1 1、設(shè)定“二叉樹”的抽象數(shù)據(jù)類型定義:、設(shè)定“二叉樹”的抽象數(shù)據(jù)類型定義:ADTADT BiTree數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象 D D:D 是具有相同特性的數(shù)據(jù)元素的集合。數(shù)據(jù)關(guān)系數(shù)據(jù)關(guān)系 R R:若
5、D ,則R ,稱 BiTree 為空二叉樹;若D ,則R H,H 是如下二元關(guān)系:(1)在 D 中存在唯一的稱為根的數(shù)據(jù)元素root,它在關(guān)系 H 下無前驅(qū);(2)若D root,則存在D rootDl,Dr,且Dl Dr;(3)若Dl,則Dl中存在唯一的元素xl,root,xlH,且存在Dl上的關(guān)系Hl H;若Dr,則Dr中存在唯一的元素xr,root,xrH,且存在Dr上的關(guān)系Hr H;H root,xl,root,xr,Hl,Hr;(4)Dl,Hl是一棵符合本定義的二叉樹,稱為根的左子樹,Dr,Hr是一棵符合本定義的二叉樹,稱為根的有字樹基本操作:基本操作:CreateBiTree&T)
6、操作結(jié)果:按照 T 的定義構(gòu)造一個(gè)二叉樹。BiTreeDepth(&T)初始條件:二叉樹T 已存在。操作結(jié)果:返回 T 的深度。BiTreeWidth(&T)初始條件:二叉樹 T 已存在。操作結(jié)果:返回 T 的寬度。PreOderTraverse&T)初始條件:二叉樹 T 已存在。操作結(jié)果:先序遍歷打印T,InOderTraverse(&T)初始條件:二叉樹 T 已存在。操作結(jié)果:中序遍歷打印T。PostOderTraverse(&T)初始條件:二叉樹 T 已存在。操作結(jié)果:后序遍歷打印T。LevelTraverse(&T)初始條件:二叉樹 T 已存在。操作結(jié)果:層次遍歷T。第 3 頁 共 2
7、7 頁DeleteXTree(&T,TElemType x)初始條件:二叉樹已存在。操作結(jié)果:刪除元素為x 的結(jié)點(diǎn)以及其左子樹和右子樹。CopyTree(&T)初始條件:二叉樹 T 已存在。操作結(jié)果:以 T 為模板,復(fù)制另一個(gè)二叉樹。ADTADT BiTree2 2、設(shè)定隊(duì)列的抽象數(shù)據(jù)類型定義:、設(shè)定隊(duì)列的抽象數(shù)據(jù)類型定義:ADTADT Queue數(shù)據(jù)對(duì)象:數(shù)據(jù)對(duì)象:D=aiai BiTree,i N 數(shù)據(jù)關(guān)系:數(shù)據(jù)關(guān)系:R1=|ai1,aiD,i=2,,n約定a1端為隊(duì)列頭,an端為隊(duì)列尾?;静僮鳎夯静僮鳎篒nitQueue(&Q)操作結(jié)果:構(gòu)造一個(gè)空隊(duì)列Q。EnQueue(&Q,&e)
8、初始條件:隊(duì)列 Q 已存在。操作結(jié)果:插入元素e 為 Q 的新的隊(duì)尾元素。DeQueue(&Q)初始條件:隊(duì)列 Q 已存在。操作結(jié)果:刪除 Q 的對(duì)頭元素,并返回其值。QueueEmpty(&Q)初始條件:隊(duì)列 Q 已存在。操作結(jié)果:若 Q 為空隊(duì)列,則返回 1,否則 0。ADT ADT Queue3 3、本程序包含四個(gè)模塊、本程序包含四個(gè)模塊1)主程序模塊voidvoid main()初始化;先序輸入二叉樹各結(jié)點(diǎn)元素;各種遍歷二叉樹;對(duì)二叉樹進(jìn)行常見運(yùn)算;復(fù)制二叉樹;在復(fù)制的二叉樹上進(jìn)行二叉樹的常見操作;2)二叉樹模塊實(shí)現(xiàn)二叉樹的抽象數(shù)據(jù)類型和基本操作2)隊(duì)列模塊實(shí)現(xiàn)隊(duì)列的抽象數(shù)據(jù)類型及今本
9、操作3)廣義表打印模塊以廣義表形式打印二叉樹4)二叉樹運(yùn)算模塊對(duì)二叉樹的葉子、非空子孫結(jié)點(diǎn)數(shù)目、度為2 或 1 的結(jié)點(diǎn)數(shù)三、三、詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì)第 4 頁 共 27 頁1 1、主程序中需要的全程量、主程序中需要的全程量#define M 10/統(tǒng)計(jì)二叉樹寬度時(shí)需用數(shù)組對(duì)每層寬度進(jìn)行存儲(chǔ),這M 表示數(shù)組的長(zhǎng)度2 2、隊(duì)列的建立與基本操作、隊(duì)列的建立與基本操作typedeftypedef strucstruct QNodeBiTree data;/隊(duì)列中存儲(chǔ)的元素類型struct QNode*next;/指向二叉樹結(jié)點(diǎn)的指針QNode,*Queueptr;typedeftypedef struct
10、structQueueptr front;/隊(duì)列的隊(duì)頭指針Queueptr rear;/隊(duì)列的隊(duì)尾指針LinkQueue;算法描述:算法描述:為了對(duì)二叉樹進(jìn)行層次遍歷,需要“先訪問的結(jié)點(diǎn),其孩子結(jié)點(diǎn)必然也先訪問”,故需運(yùn)用到隊(duì)列。而考慮到層次遍歷對(duì)隊(duì)列操作的需要,只需進(jìn)行隊(duì)列的初始化,入隊(duì)和出隊(duì)以及檢查隊(duì)列是否為空。偽碼算法偽碼算法:voidvoid InitQueue(LinkQueue*Q)/初始化隊(duì)列申請(qǐng)一個(gè)結(jié)點(diǎn)Q-front=Q-rear=(Queueptr)malloc(sizeofsizeof(QNode);if if(!Q-front)exit(1);/存儲(chǔ)分配失敗處理Q-fro
11、nt-next=NULL;/構(gòu)成帶頭結(jié)點(diǎn)里的空鏈隊(duì)列voidvoid EnQueue(LinkQueue*Q,BiTree e)/插入元素為 e 為 Q 的隊(duì)尾元素Queueptr q;q=(Queueptr)malloc(sizeofsizeof(QNode);if if(!q)exit(1);q-data=e;q-next=NULL;Q-rear-next=q;/元素 e 的結(jié)點(diǎn)入列Q-rear=q;BiTree DeQueue(LinkQueue*Q)/從隊(duì)列中刪除隊(duì)頭元素,并直接返回給調(diào)用的主函數(shù)Queueptr p;BiTree q;if if(Q-front=Q-rear)/隊(duì)列為
12、空printf(ERROR!n);exit(1);p=Q-front-next;第 5 頁 共 27 頁q=p-data;Q-front-next=p-next;/刪除該結(jié)點(diǎn)if if(Q-rear=p)Q-rear=Q-front;free(p);returnreturn q;/返回隊(duì)頭元素intint QueueEmpty(LinkQueue*Q)/檢查隊(duì)列是否為空,若為空則返回真值,否則返回0if if(Q-front=Q-rear)returnreturn 1;elseelsereturnreturn 0;3 3、二叉樹的建立與基本操作、二叉樹的建立與基本操作typedef struc
13、ttypedef struct BiTNodeTElemType data;/二叉樹結(jié)點(diǎn)存儲(chǔ)的元素類型structstruct BiTNode*lchild,*rchild;/二叉樹左右孩子指針BiTNode,*BiTree;算法分析:算法分析:二叉樹的基本操作是本程序的核心,考慮到二叉樹的定義就是采用遞歸定義,所以很容易想到對(duì)二叉樹的操作可通過遞歸調(diào)用來實(shí)現(xiàn)。1 1)二叉樹的遍歷)二叉樹的遍歷算法描述:算法描述:二叉樹中常常要求在樹中查找具有某種特征的結(jié)點(diǎn),或者對(duì)樹中全部結(jié)點(diǎn)逐一進(jìn)行某種處理,這就需要遍歷二叉樹。即要求按某條路徑尋訪樹中的每個(gè)結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)均被訪問一次,而且僅被訪問一次。
14、回顧二叉樹的遞歸定義可知,二叉樹是由 3 個(gè)基本單元組成:根節(jié)點(diǎn)、左子樹和右子樹。因此,若能依次遍歷這三部分,便是遍歷了整棵二叉樹。如果以L、D、R 分別表示遍歷左子樹、訪問根結(jié)點(diǎn)和遍歷右子樹,則可有DLR、LDR、LRD、DRL、RDL、RLD 這 6 種遍歷二叉樹的方案。若限定先右后左,則只有前三種情況,分別稱之為先(根)序遍歷。中(根)序遍歷和后(根)序遍歷。基于二叉樹的遞歸定義,可得下述遍歷二叉樹的遞歸定義算法。先序遍歷二叉樹的操作定義:若二叉樹為空,則空操作;否則(1)訪問根結(jié)點(diǎn);(2)先序遍歷左子樹;(3)先序遍歷右子樹。偽碼算法:偽碼算法:voidvoid PreOderTrav
15、erse(BiTree T)/采用二叉鏈表存儲(chǔ)結(jié)構(gòu)if if(T)putchar(T-data);/最簡(jiǎn)單的訪問結(jié)點(diǎn)法,輸出結(jié)點(diǎn)元素,這里先訪問根結(jié)點(diǎn)PreOderTraverse(T-lchild);第 6 頁 共 27 頁P(yáng)reOderTraverse(T-rchild);中序遍歷二叉樹的操作定義:若二叉樹為空,則空操作;否則(1)中序遍歷左子樹;(2)訪問根結(jié)點(diǎn);(3)中序遍歷右子樹。偽碼算法:偽碼算法:voidvoid InOderTraverse(BiTree T)/采用二叉鏈表存儲(chǔ)結(jié)構(gòu)if if(T)InOderTraverse(T-lchild);/先遍歷左子樹putchar(T
16、-data);/最簡(jiǎn)單的訪問結(jié)點(diǎn)法,輸出結(jié)點(diǎn)元素,這里第二訪問根結(jié)點(diǎn)InOderTraverse(T-rchild);后序遍歷二叉樹的操作定義:若二叉樹為空,則空操作;否則(1)后序遍歷左子樹;(2)后序遍歷右子樹;(3)訪問根結(jié)點(diǎn)。偽碼算法:偽碼算法:voidvoid PostOderTraverse(BiTree T)/采用二叉鏈表存儲(chǔ)結(jié)構(gòu)if if(T)PostOderTraverse(T-lchild);/先遍歷左子樹PostOderTraverse(T-rchild);/再遍歷右子樹putchar(T-data);/最后訪問根結(jié)點(diǎn)2 2)二叉樹的建立)二叉樹的建立算法描述:算法描述:
- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
15 積分
下載 | 加入VIP,下載共享資源 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 數(shù)據(jù)結(jié)構(gòu) 算法 實(shí)驗(yàn) 報(bào)告 二叉
鏈接地址:http://zhizhaikeji.com/p-29584512.html