二叉樹的前序 中序 後序的遍歷 遞迴 非遞迴

2021-08-25 08:40:45 字數 2499 閱讀 3291

前言:二叉樹的非遞迴遍歷需要用到棧的一些操作,所以貼出棧的相關操作的鏈結

定義資料結構

typedef

char btdatatype;

typedef

struct binarytreenode

btnode;

1.前序遍歷

遞迴:按照前序遍歷的規則,先訪問根節點,在遞迴遍歷左子樹,最後遞迴遍歷右字樹,整個問題可以轉換成好多個子問題進行求解

void binarytreeprevorder_r(btnode* root)

//訪問根

printf("%c", root->_data);

//遞迴訪問左子樹

binarytreeprevorder_r(root->_left);

//遞迴訪問右子樹

binarytreeprevorder_r(root->_right);

}

非遞迴:利用棧的後進先出性質

void binarytreeprevorder(btnode* root)

//2.從棧裡出來,說明左樹已經被訪問過了

btnode* top = stacktop(&s);

stackpop(&s);

//3.子問題訪問右樹

cur = top->_right;}}

2.中序遍歷

遞迴:按照中序遍歷的規則,先遞迴遍歷左子樹,在訪問根節點,最後遞迴遍歷右字樹,整個問題可以轉換成好多個子問題進行求解

void binarytreemidorder_r(btnode* root)

//遞迴訪問左子樹

binarytreemidorder_r(root->_left);

//訪問根

printf("%c", root->_data);

//遞迴訪問右子樹

binarytreemidorder_r(root->_right);

}

非遞迴:利用棧的性質,先將左路結點全部壓棧,出棧就說明棧頂元素左子樹已經遍歷完了,這時把棧頂元素的右子樹當做是乙個子問題來看待,遍歷它的右子樹,直到cur和棧都為空,則所有結點都被遍歷完了

void binarytreemidorder(btnode* root)

//2.出棧說明左樹已經訪問完了,現在訪問根節點

btnode* top = stacktop(&s);

printf("%c", top->_data);

stackpop(&s);

//子問題訪問右樹

cur = top->_right;}}

3.後序遍歷

遞迴:按照後序遍歷的規則,先遞迴遍歷左子樹,在遞迴遍歷右字樹,最後在訪問根節點,整個問題可以轉換成好多個子問題進行求解

void binarytreepostorder_r(btnode* root)

//遞迴訪問左子樹

binarytreepostorder_r(root->_left);

//遞迴訪問右子樹

binarytreepostorder_r(root->_right);

//訪問根

printf("%c", root->_data);

}

非遞迴:後序遍歷的非遞迴相比前序、和中序的非遞迴比較難一些,因為後序遍歷是先遍歷左子樹,在遍歷右子樹,最後訪問根節點。當我們將左路的所有結點壓棧,當要出棧遍歷它的右子樹的時候,我們並不知道右子樹是否已經遍歷過了,這點必須想個辦法解決。

void binarytreepostorder(btnode* root)

//2.取棧頂,出棧說明左路結點已經訪問

btnode* top = stacktop(&s);

//3.如果當前結點右樹為空,則直接訪問該節點;

// 如果右樹存在,並且已經訪問過,則直接訪問它

//(prev是前乙個被訪問過的結點,如果右樹的根節點等於prev,則說明右樹被訪問過)

if ((top->_right ==

null)||(prev == top->_right))

//如果右樹存在,並且沒有訪問過,則去訪問它的右樹(子問題)

else}}

二叉樹的遞迴遍歷 (前序,中序,後序,層序)

首先我們來講前序遍歷。前序遍歷很簡單,首先判斷根樹是否為空 注意前序遍歷的次序是 根 左子樹 右子樹 如此遞迴呼叫。以下為 templatevoid bitree preorder binode bt 中序遍歷是實際問題中經常使用的一種遍歷。其 形式與前序遍歷很相似,其遍歷順序為 左子樹 根 右子樹...

二叉樹的非遞迴前序中序後序遍歷

做個筆記,方便日後查閱 全部是模板函式,c 語言 template void preorder node root,ostream os if st.empty os endl template void midorder node root,ostream os if st.empty os en...

二叉樹的前序 中序 後序遍歷(非遞迴)

今天弄了一天的二叉樹的前序 中序和後序遍歷,分享出來,共同交流。中採用先序遍歷的方法建立二叉樹,示例建立二叉樹格式如下 建立過程中,以 include include typedef struct btnodebtnode,btree typedef struct stackbtstack type...