二叉樹先序中序後序遍歷的非遞迴實現A

2021-05-24 14:28:15 字數 620 閱讀 2891

遍歷二叉樹的遞迴程式

可以看到三種遍歷方法的遞迴實現形式完全一樣,只需改變visit的位置,就得到不同遍歷序列。因此從情感上覺得非遞迴實現應該形式也完全一樣,這是課本給的中序非遞迴實現:

只需將visit(p->data);移動到push(s,p); 後,就能得到先序遍歷的非遞迴實現。然後在考慮後序遍歷時,發現這種形式不適用後序遍歷,所以後來不得不自己寫了乙個後序遍歷的非遞迴程式。然而心裡始終覺得不舒服,為什麼遞迴實現上明明如此統一,到了非遞迴實現後序遍歷就與眾不同了呢?

課本的非遞迴實現對棧的使用並不和遞迴棧相同,因此結點的進出棧順序也和遞迴棧明顯不同,基於這個道理,寫了乙個完全仿照遞迴棧工作的非遞迴實現,關鍵是出棧的條件發生了變化,而且從直覺上,這個程式的出棧和進棧語句(push,pop),賦值左孩子和右孩子(p=p->lchild或rchild)都應只出現一次,如果出現了多次,應該是功能重複了,可以再進行縮減。

程式如下:

在這種形式下,只需改變visit的位置就能得到三種遍歷的非遞迴實現,結點的進出棧順序完全和遞迴棧一樣,判斷結點是否出棧的條件是:上一次出棧的結點是棧頂元素的右孩子。

對幾棵二叉樹進行了試驗,結果是對的,但不知道有沒有疏忽的地方。

二叉樹的非遞迴遍歷(先序,中序,後序)

遍歷演算法 1 中序遍歷的遞迴演算法定義 若二叉樹非空,則依次執行如下操作 1 遍歷左子樹 2 訪問根結點 3 遍歷右子樹。2 先序遍歷的遞迴演算法定義 若二叉樹非空,則依次執行如下操作 1 訪問根結點 2 遍歷左子樹 3 遍歷右子樹。3 後序遍歷得遞迴演算法定義 若二叉樹非空,則依次執行如下操作 ...

二叉樹的非遞迴先序,中序,後序遍歷

二叉樹的非遞迴遍歷 先序遍歷,中序遍歷,後序遍歷 include include using namespace std typedef struct node binode,bitree 先序遞迴建立樹,這裡注意引數的型別,t的型別是 如果是 稍加改動就ok.void createtree bit...

二叉樹的非遞迴先序 中序 後序遍歷

演算法思想 先序 nlr的訪問順序,由於r節點,即右孩子的訪問需要通過根節點的指標來實現,所以,需要設乙個棧來儲存根節點。具體看 void preorder btree t else while 中序遍歷和先序遍歷幾乎一樣 void midorder btree t else 後序遍歷 lrn順序。...