遍歷二叉樹,最常用的遞迴實現遍歷二叉樹,但我們還可以用非遞迴和層次遍歷樹的方法,這裡就要用到棧和佇列的一些知識,現在就讓我們把這兩個結合起來一起用。
這個是非遞迴中序遍歷二叉樹,非遞迴我們可以用棧的思想,中序遍歷的時候,我們可以先一直把左子樹全裝棧裡面,然後當裝完左子樹的結點後,我們就出棧並輸出,然後跳到右子樹,依次迴圈,對應的**如下:
#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共兩行,每行是由字母組成的字串 一行...