遍歷是面試和筆試經常考的東西,其實也不難,但是如果不能了解透徹的話,在面試中還是會被面試官難倒。所以,下面對遍歷總結一下。遍歷分為三種方式分別為:前序遍歷,中序遍歷和後序遍歷,分類的依據主要是根據二叉樹的根節點和兩個葉子節點訪問的順序來定的,這裡的前,中,後是指根節點的訪問順序。如果根節點先被訪問,然後訪問左子樹再訪問右子樹就是先序遍歷,如果先訪問左子樹,然後訪問根節點,最後訪問右子樹就是中序遍歷,如果先訪問左子樹,再訪問右子樹,最後訪問根節點則是後序遍歷,這些是二叉樹遍歷的基本概念。
二叉樹遍歷一般用遞迴的思想比較容易理解,我們需要遞迴的遍歷左子樹和右子樹,那麼這三種遍歷的方式的區別是輸出結果的語句和訪問左子樹以及右子樹的順序。如果放在遞迴左子樹和右子樹的前面就是前序遍歷,如果放在二者中間就是中序遍歷,如果放在後面就是後序遍歷。這是比較容易理解的,**也比較好寫。但是,面試官往往會讓你寫非遞迴版本,這樣的話就需要對資料結構和對二叉樹的遍歷有比較深的理解。
二叉樹的非遞迴版本一般都是借用棧這種資料結構來完成的,通過其先進後出的特性來完成二叉樹的遍歷。
首先,我們需要建立一顆二叉樹,我寫成了標頭檔案
#ifndef creattree_h_included
#define creattree_h_included
#includeusing namespace std;
struct treenode;
void createbitree(treenode *&t)
}#endif // creattree_h_included
這裡使用遞迴的方法以先序遍歷的方式建立的。
下面是非遞迴版本的遍歷方式
#include#include "creattree.h"
using namespace std;
//前序遍歷非遞迴
void preorder(treenode *t)
else
}}//中序遍歷非遞迴
void midorder(treenode *t)
else
}}//後序遍歷非遞迴
void postorder(treenode *t)
p = st.top();
if(p -> right == null || p -> right == last)
else
}}int main()
二叉樹遍歷的非遞迴總結
本文主要總結先序,中序,後序的非遞迴,基本思路都是用stack進行 先序的非遞迴,兩種寫法,一種是注意加入左右孩子時判斷是否為空,主要注意先加入右孩子保證左孩子先出來 void preorderiter treenode root 另一種寫法,一直訪問左孩子直到空訪問右孩子 void preorde...
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹非遞迴遍歷
二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...