第四章 樹(遍歷二叉樹)

2022-07-16 01:15:19 字數 1693 閱讀 7191

遍歷二叉樹,最常用的遞迴實現遍歷二叉樹,但我們還可以用非遞迴和層次遍歷樹的方法,這裡就要用到棧和佇列的一些知識,現在就讓我們把這兩個結合起來一起用。

這個是非遞迴中序遍歷二叉樹,非遞迴我們可以用棧的思想,中序遍歷的時候,我們可以先一直把左子樹全裝棧裡面,然後當裝完左子樹的結點後,我們就出棧並輸出,然後跳到右子樹,依次迴圈,對應的**如下:

#include

#include

typedef struct tnode tnode,*tree;

typedef struct snode snode,*stack;

void initstack (stack *s);//初始化棧

void createtree (tree *t);//建立乙個二叉樹。

void pre (tree t);//先序遍歷二叉樹。

void pre1 (tree t);//非遞迴中序遍歷二插樹。

void push (stack s, tree t);//進棧。

tree pop (stack s);//出棧。

int isfull (stack s);//判斷是否為滿。

int isempty (stack s);//判斷是否為空。

int main ()

void pre1 (tree t)

if(!isempty(s)) }}

void initstack (stack *s)

int isfull( stack s)

int isempty (stack s)

void push (stack s, tree t)

else

}tree pop (stack s)

else

}void pre (tree t)

}void createtree (tree *t)

else

}下面就是層次遍歷,層次遍歷就是利用佇列的思想,先進先出,以樹的第乙個為起點,開始輸出,輸出後,若有左右子樹,則進隊,若沒有,則依次出隊,再入隊,依次迴圈。直到隊列為空。

#include

#include

typedef struct tnode tnode,*tree;

typedef struct qnode qnode,*queue;

void initqueue (queue *q);//初始化佇列。

void en (queue q, tree t);//進隊。

tree de (queue q);//出隊。

int isfull (queue q);//判斷是否為滿。

int isempty (queue q);//判斷是否為空。

void createtree (tree *t);//建立一顆二插樹。

void level (tree t);//層次遍歷二叉樹。

int main ()

void createtree (tree *t)

else

}void level (tree t)

}void initqueue (queue *q)

int isfull(queue q)

int isempty (queue q)

void en (queue q, tree t)

else

}tree de (queue q)

else

}

第四章 樹 二叉樹 森林轉換

樹轉換為二叉樹 1 加線。在所有兄弟結點之間加一條連線。2 去線。樹中的每個結點,只保留它與第乙個孩子結點的連線,刪除它與其它孩子結點之間的連線。3 層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第乙個孩子是結點的左孩子,兄弟轉換過來的孩子是結點的右孩子 森林轉換為...

第四章 決策樹

一般的,一棵決策樹包含乙個根節點,若干個內部節點和若干個葉節點。決策學習的目的是為了產生一棵泛化能力強,即處理未見示例能力強的決策樹。決策樹學習的關鍵是如何選擇劃分屬性。隨著劃分過程的不斷進行,我們希望決策樹的分支節點所包含的樣本盡可能屬於同一類別,即節點的 純度 越來越高。1 資訊增益 資訊熵是度...

二叉樹遍歷(樹)

description 樹和二叉樹基本上都有先序 中序 後序 按層遍歷等遍歷順序,給定中序和其它一種遍歷的序列就可以確定一棵二叉樹的結構。假定一棵二叉樹乙個結點用乙個字元描述,現在給出中序和按層遍歷的字串,求該樹的先序遍歷字串。input 輸入檔案flist.in共兩行,每行是由字母組成的字串 一行...