非遞迴遍歷二叉樹

2022-01-22 21:34:41 字數 1108 閱讀 9531

使用遞迴可以非常方便地實現二叉樹的遍歷。如果不使用遞迴呢,請聽我一一道來。

首先給出二叉樹遍歷的遞迴版本:

struct

btnode ;

void visit(btnode *p)

//先序遍歷

void preorder(btnode *t)}//

中序遍歷

void inorder(btnode *t)}//

後序遍歷

void postorder(btnode *t)

}

下面給出二叉樹遍歷的非遞迴版本:

//

非遞迴先序遍歷

void preorder1(btnode *t)

}void preorder2(btnode *t)

if (!s.empty())

}}//

非遞迴中序遍歷

void inorder1(btnode *t)

if (!s.empty())

}}//

非遞迴後序遍歷

void postorder1(btnode *t)

cur =s.top();

//當前節點的右孩子如果為空或者已經被訪問,則訪問當前節點

if (cur->rchild == null || cur->rchild ==pre)

else

cur = cur->rchild;}}

參考文章:

再補充乙個層次遍歷版本:

//

層次遍歷

建立二叉樹:

//

建立二叉樹

void createbitree(btnode* &t)

}

主函式**:

int

main()

輸出:

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

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...