遍歷二叉樹的非遞迴演算法

2021-08-29 21:44:25 字數 1423 閱讀 7450

根據樹中結點的遍歷規律及順序直接寫出其非遞迴演算法。

[b]先序非遞迴演算法 [/b]

【思路】

假設:t是要遍歷樹的根指標,若t != null

對於非遞迴演算法,引入棧模擬遞迴工作棧,初始時棧為空。

問題:如何用棧來儲存資訊,使得在先序遍歷過左子樹後,能利用棧頂資訊獲取t的右子樹的根指標?

方法1:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。

方法2:訪問t->data後,將t->rchild入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t->rchild,出棧,遍歷以該指標為根的子樹。

【演算法1】

void preorder(bitree t, status ( *visit ) (elemtype e))

if( !stackempty(s) )

} }

【演算法2】

void preorder(bitree t, status ( *visit ) (elemtype e))

if ( !stackempty(s) )

} }

進一步考慮:對於處理流程中的迴圈體的直到型、當型+直到型的實現。

[b]中序非遞迴演算法[/b]

【思路】

t是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。

問題:如何用棧來儲存資訊,使得在中序遍歷過左子樹後,能利用棧頂資訊獲取t指標?

方法:先將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,訪問t->data,再中序遍歷t的右子樹。

【演算法】

void inorder(bitree t, status ( *visit ) (elemtype e))

if( !stackempty(s) )

} }

進一步考慮:對於處理流程中的迴圈體的直到型、當型+直到型的實現。

[b]後序非遞迴演算法 [/b]

【思路】

t是要遍歷樹的根指標,後序遍歷要求在遍歷完左右子樹後,再訪問根。需要判斷根結點的左右子樹是否均遍歷過。

可採用標記法,結點入棧時,配乙個標誌tag一同入棧(0:遍歷左子樹前的現場保護,1:遍歷右子樹前的現場保護)。

首先將t和tag(為0)入棧,遍歷左子樹;返回後,修改棧頂tag為1,遍歷右子樹;最後訪問根結點。 [page]

typedef struct stackelementstackelemtype;

【演算法】

void postorder(bitree t, status ( *visit ) (elemtype e))

while ( !stackempty(s) && gettoptag(s)==1)

if ( !stackempty(s) )else break; } }

二叉樹遍歷 非遞迴演算法

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

二叉樹遍歷非遞迴演算法

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

二叉樹遍歷非遞迴演算法

遞迴演算法非常的簡單。先訪問跟節點,然後訪問左節點,再訪問右節點。如果不用遞迴,那該怎麼做呢?仔細 一.先序遍歷 看一下遞迴程式,就會發現,其實每次都是走樹的左分支 left 直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場,訪問右子樹。由於一直走到最左邊後,需要逐步返回到父節點訪問...