二叉樹遍歷非遞迴演算法

2022-01-24 15:45:28 字數 707 閱讀 3963

遞迴演算法非常的簡單。先訪問跟節點,然後訪問左節點,再訪問右節點。如果不用遞迴,那該怎麼做呢?仔細

一.先序遍歷

看一下遞迴程式,就會發現,其實每次都是走樹的左分支(left),直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場,訪問右子樹。

由於一直走到最左邊後,需要逐步返回到父節點訪問右節點,因此必須有乙個措施能夠對節點序列回溯。

可以用棧記憶:在訪問途中將依次遇到的節點儲存下來。由於節點出現次序與恢復次序是反序的,因此是乙個先

進後出結構,需要用棧;還可以節點增加指向父節點的指標。 

void preorder1(tnode* root) 

else

} }

void preorder2(tnode* root) 

} }

二.中序遍歷

void inorder1(tnode* root) 

if ( !s.empty() )

} }

三.後序遍歷

不寫了……

四.層次遍歷

// 層序遍歷偽**:非遞迴版本,用佇列完成 

void levelorder(tnode *root)

if (null != node->right) // 右孩子入隊

} }

參考文獻:

二叉樹遍歷 非遞迴演算法

文庫文章 二叉樹前序遍歷 根 左結點 右結點 所以在訪問到乙個節點不為空時 先訪問此結點,然後把此結點的非空右孩子先入棧,然後再把非空左孩子入棧。具體 如下 二叉樹後序非遞迴演算法 第二種思路 要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,...

二叉樹遍歷非遞迴演算法

輸入 include include define maxsize 100 typedef char elemtype using namespace std typedef struct node btnode 建立二叉樹 void createbtnode btnode b,char str j...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...