第六次作業

2022-07-09 18:42:11 字數 2835 閱讀 8307

|這個作業屬於哪個課程|

|這個作業要求在**|

|這個作業的目標|掌握理解二叉樹基本特性,遍歷演算法|

|學號| 2018204291 |

一、實驗目的

1、掌握二叉樹的基本特性

2、掌握二叉樹的先序、中序、後序的遞迴遍歷演算法

3、理解二叉樹的先序、中序、後序的非遞迴遍歷演算法

4、通過求二叉樹的深度、葉子結點數和層序遍歷等演算法,理解二叉樹的基本特性

二、實驗預習

說明以下概念

1、二叉樹:

二叉樹是指樹中節點的度不大於2的有序樹,它是一種最簡單且最重要的樹。二叉樹的遞迴定義為:二叉樹是一棵空樹,或者是一棵由乙個根節點和兩棵互不相交的,分別稱作根的左子樹和右子樹組成的非空樹;左子樹和右子樹又同樣都是二叉樹。

2、遞迴遍歷:

遞迴先序遍歷二叉樹的操作定義為:訪問根結點,先序遍歷左子樹,先序遍歷右子樹。遞迴中序遍歷二叉樹的操作定義為:中序序遍歷左子樹,訪問根結點,中序遍歷右子樹。遞迴後序遍歷二叉樹的操作定義為:後序遍歷左子樹,後序遍歷右子樹,訪問根結點。

3、非遞迴遍歷:

根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後,若其左孩子不為空,按相同規則訪問它的左子樹;當訪問其左子樹時,再訪問它的右子樹。

根據中序遍歷的順序,對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,然後按相同的規則訪問其右子樹。

根據後序遍歷的順序,對於任一結點p,將其入棧,然後沿其左子樹一直往下搜尋,直到搜尋到沒有左孩子的結點,此時該結點出現在棧頂,但是此時不能將其出棧並訪問,因此其右孩子還為被訪問。所以接下來按照相同的規則對其右子樹進行相同的處理,當訪問完其右孩子時,該結點又出現在棧頂,此時可以將其出棧並訪問。這樣就保證了正確的訪問順序。可以看出,在這個過程中,每個結點都兩次出現在棧頂,只有在第二次出現在棧頂時,才能訪問它。因此需要多設定乙個變數標識該結點是否是第一次出現在棧頂。

4、層序遍歷:

設二叉樹的根節點所在層數為1,層序遍歷就是從所在二叉樹的根節點出發,首先訪問第一層的樹根節點,然後從左到右訪問第2層上的節點,接著是第三層的節點,以此類推,自上而下,自左至右逐層訪問樹的結點的過程就是層序遍歷

三、實驗內容和要求

1、閱讀並執行下面程式,根據輸入寫出執行結果,並畫出二叉樹的形態。

typedef struct btnode*bitree;

void createbitree(bitree t)

q=(bitree)malloc(sizeof(struct btnode));

if(q==null)

q->data=s;

t=q;

createbitree(&q->lchild); /遞迴建立左子樹/

createbitree(&q->rchild); /遞迴建立右子樹*/

}void preorder(bitree p)

}void inorder(bitree p)

}void postorder(bitree p)

}void preorder_n(bitree p)

}void release(bitree t)

}int main()

執行程式

輸入:abc##de#g##f###

執行結果:

preorder the tree is:abcdegf

inorder the tree is:cbegdfa

postorder the tree is:cgefdba

無序遍歷序列:abcdegf

int j=0;

bitree stack[max],q;

int top=0,i;

for(i=0; i初始化棧/

q=p;

while(q!=null)

return j;

執行結果:

proorder the is:abcdegf

inorder the is:cegdfa

postorder the is:cgefdba

先序遍歷序列:abcdegf

節點數:7

int num1=0 ,num2=0;

if(pnull)

return 0;

else if(p->lchildnull&&p->rchild==null)

return 1;

else

執行結果:

preorder the is:abcdegf

inorder the is:cbegdfa

postorder the is:cgefdba

先序遍歷序列:abcdegf

節點總數:7

葉結點數:3

4、在上題中補充求二叉樹深度演算法,並在主函式中補充相應的呼叫驗證正確性。

演算法**:

int lchilddep,rchilddep;

if(p==null)

return 0;

else

執行結果:

preorder the tree is:abcdegf

inorder the tree is:cbegdfa

postoreder the tree is:cgefdba

先序遍歷序列:abcdegf

節點數:7

葉結點數:3

樹的深度:5

5、補充二叉樹中序、後序非遞迴演算法。

四、實驗小結:

通過實驗,了解了二叉樹的基本特性,熟練掌握了二叉樹的先序、中序、後序的遞迴遍歷演算法,並且認識了解了求二叉樹的深度、葉子結點數和層序遍歷等演算法。

第六次作業

姓名 陳裕坤 學號 120705213 班級 12電信2班 作業1 總結,到目前為止,c語言基礎知識已介紹完,下一階段重點是指標。請從以下幾個方面小結 1.程式設計重在實踐,多程式設計才會對其理解更深,我是如何學習c語言的?2.程式設計涉及到方方面面知識,就像英語單詞一樣,一開始不可能了解每個c元素...

第六次作業

一 問題及 檔名稱 2.cpp 作 者 劉澤 完成日期 2017年5月18日 版 本 號 v1.0 對任務的求解方法及描述部分 輸入描述 問題描述 定義乙個不重複的有初值的10個元素的整數陣列a,利用冒泡法對陣列a排序 1 刪除x 2 插入x 程式輸出 問題分析 用迴圈結構進行編寫 演算法設計 in...

第六次作業

檔名稱 jll.cpp 作 者 謝陽泉 完成日期 2017 年 5 月 19 日 版 本 號 v1.0 對任務及求解方法的描述部分 專案一 陣列操作 輸入描述 略 問題描述 定義乙個不重複的有初值的10個元素的整數陣列a,利用冒泡法對陣列a排序後完成以下操作。程式輸出 3 4 5 6 7 8 9 1...