根據樹中結點的遍歷規律及順序直接寫出其非遞迴演算法。
[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 直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場,訪問右子樹。由於一直走到最左邊後,需要逐步返回到父節點訪問...