非遞迴遍歷二叉樹

2021-06-18 03:59:03 字數 796 閱讀 1840

使用棧輔助實現二叉樹的非遞迴前序、中序和後序遍歷

前序遍歷:

遍歷順序:根->左子樹->右子樹

分析:先訪問根,右子樹入棧,然後訪問左子樹

void preordernorecursion(binarynode* bt)

coutif (p->rchild != null)

s.push(p->rchild);

p = p->lchild;

}}

中序遍歷:

遍歷順序:左子樹->根->右子樹

分析:將根入棧,先訪問左子樹,根出棧之後,訪問根,然後訪問右子樹

void inordernorecursion(binarynode* bt) else 

}}

後序遍歷:

遍歷順序:左子樹->根->右子樹

分析:先將根入棧,訪問左子樹,然後根出棧,如果沒有訪問右子樹,則將根入棧先訪問右子樹,否則訪問根,然後向上繼續。此處使用乙個pre指標判斷是否已訪問右子樹,根據後序遍歷的順序,乙個節點的前驅節點是其右子樹的根節點,如果pre指向其右子樹根節點,則其右子樹已訪問,否則未訪問。

void postordernorecursion(binarynode* bt) else  else 

} }}

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

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

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...