二叉樹的三種非遞迴遍歷

2021-06-26 09:48:07 字數 675 閱讀 3125

遞迴演算法和非遞迴演算法的轉換:

可以借助棧,將二叉樹的遞迴演算法轉換為非遞迴演算法,下面以中序遍歷為例給出中序遍歷的非遞迴演算法。先掃瞄(並非訪問)根結點的所有左結點並將他們一一進棧。然後出戰乙個結點 *p(顯然結點*p沒有左孩子結點或者左孩子結點均已訪問過),則訪問它。然後掃瞄該結點的有孩子結點,將其進棧在掃瞄該右孩子結點的所喲左結點並一一進棧,如此繼續,知道棧空為止。

/*中序遍歷非遞迴演算法*/

void inorder2(bitree tree, void(*visit)())

else}}

在說一下比較麻煩的後序非遞迴二叉樹遍歷演算法:

演算法的思想:

因為後序非遞迴遍歷二叉樹的順序是先訪問左子樹,再訪問右子樹,最後訪問根結點。當用棧來儲存結點,必須分清返回的根結點時,是從左子樹返回的,還是從右子樹返回的。所以,使用輔助指標r,其指向最近訪問過的結點。也可以在結點中增加乙個標誌域,記錄是否已經訪問過;

/*後序遍歷非遞迴演算法*/

void postorder2(bitree tree, void(*visit)())

else

else}}

}附加上先序遍歷非遞迴演算法:理解同中序類似;

/*先序遍歷非遞迴演算法*/

void preorder2(bitree tree, void(*visit)())

else}}

二叉樹的三種非遞迴遍歷

一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。1.遞迴實現 void preorder1 bintree root 遞迴前序遍歷 2.非遞迴實現 根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後...

二叉樹的三種非遞迴遍歷

struct treenode 一 前序輸出二叉樹 void preorder treenode root p stk.top stk.pop p p right 二 中序輸出二叉樹 void midorder treenode root p stk.top cout void postorder ...

二叉樹的三種非遞迴遍歷

中序遍歷 後序遍歷 非遞迴必會用到棧吶!void preorder btnode b 如果左節點不存在 if top 1 訪問p節點,並將p節點入棧 2 如果左節點存在,則讓p指向左節點,迴圈1步驟 3 左節點不在了,則出棧一次,讓棧頂元素等於目前節點的親節點,藉此讓p指標指向這個左節點的兄弟。4 ...