注釋:後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程a
b c
d e f h
當遍歷到最左邊的時候,d沒有左右結點了,輸出d,需要返回b去遍歷b的右子樹,e沒有左右結點e輸出,
e輸出後返回b是該輸出b了吧,但是b有左右結點d和e啊,這裡是後序遍歷所以既然進入了右子樹那麼他的兄弟結點d必然是訪問和輸出過了,所以要把e標記一下剛訪問過,所以這裡定義了乙個記憶指標r=null,一會只要判斷一下b的右結點等於r就說明訪問過了。其實就是判斷乙個分支沒有了最右結點這個子樹就訪完了
#include#include#include#include#define maxsize 50
using namespace std;
typedef struct node*bitree,nodetree;
stackst;
void createtree(bitree &t)
} void visit(char ch)
else
else
} }}
int main()
後序非遞迴遍歷二叉樹
後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。第一次進棧時,在遍歷左子樹的過程中將 根 節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個 根 節點,但不能立即訪問,只能借助於這個 根 去找該 根 的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍...
二叉樹後序遍歷 非遞迴
二叉樹後序遍歷 非遞迴 這裡我們約定 空的節點用空格表示,按照前序遍歷來建立樹!main.cpp 2 include iostream 3using namespace std 4typedef struct node binode,bitree 9typedef struct node1stack...
二叉樹後序遍歷 遞迴和非遞迴
今天剛好想到這個問題,但是不太會,就查詢後記錄一下。首先是節點類 沒有進行一些屬性的封裝,見諒!class treenode public treenode list diguires newarraylist 遞迴進行後序遍歷 直接就先左,右,中順序遞迴呼叫即可 public list digui...