樹 二叉樹的後序遍歷 非遞迴寫法

2021-09-28 18:36:14 字數 1306 閱讀 1702

樹的前序和中序遍歷我們都已經寫完了,現在我們來寫一下樹的後序遍歷的非遞迴寫法。

迴圈體內每次要執行的東西實現思路如下:

先找最左邊的節點,統統入棧。

利用乙個while迴圈回溯完有右子樹,或者左右節點都被訪問過了的節點,將其出棧,並將結果輸出。

將指標指向右子樹。留給下一次迴圈。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

// 處理根節點

s.push(root);

auto p = root->left;

hash.insert(p);

// 開始搜尋

while (!s.empty())

// 不斷回溯,直到找到可以搜尋右子樹的節點

p = s.top();

while (!s.empty() && (hash.count(p->left) && hash.count(p->right) || !p->right))

p = p->right;

hash.insert(p);

}return result;

}};

由於引入了hash用來記錄節點是否被訪問過,程式的編寫難度直線上公升。事實上,完全不需要引入hashtable,網上有很多不錯的解法,***貼乙個我自認為較好的。

基本上差不多,但是**的層面上做了不少改進,如:

最外層的while迴圈使用了p || stk.size();這樣我們在前面不需要對根節點做特殊處理了(不然第一次就進不去迴圈)。

主函式體僅僅用了乙個while內套一對巢狀的if,這提示我們——有時候不需要在while迴圈再套一層迴圈,可以看看利用外層的while迴圈可不可以達到這個效果。

沒有使用所謂的hash表,僅僅記錄了上一次訪問的節點,降低了複雜度。

還有一些技巧,比如只檢測右節點有沒有被訪問過,這是因為我們最先訪問的就是左節點。

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution else}}

return res;

}};

二叉樹非遞迴後序遍歷

注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程a b c d e f h 當遍歷到最左邊的時候,d沒有左右結點了,輸出d,需要返回b去遍歷b的右子樹,e沒有左右結點e輸...

後序非遞迴遍歷二叉樹

後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。第一次進棧時,在遍歷左子樹的過程中將 根 節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個 根 節點,但不能立即訪問,只能借助於這個 根 去找該 根 的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍...

二叉樹後序遍歷 非遞迴

二叉樹後序遍歷 非遞迴 這裡我們約定 空的節點用空格表示,按照前序遍歷來建立樹!main.cpp 2 include iostream 3using namespace std 4typedef struct node binode,bitree 9typedef struct node1stack...