後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。
第一次進棧時,在遍歷左子樹的過程中將」根」節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個」根」節點,但不能立即訪問,只能借助於這個」根」去找該」根」的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍歷以後,再退出該」根」節點,並訪問它。
所以為了記錄節點是第一次還是第二次進棧,就在堆疊資料元素的結構中增加乙個資料項:進棧標誌。
(1)當節點非空時或堆疊非空時,執行(2),否則結束演算法;
(2)當節點指標非空時,節點的進棧標誌設為false,節點指標及進棧標誌進棧,然後將節點指向進棧節點的左子樹的根,重複(2),知道指標為空(最後乙個進棧的是最左子樹),節點指標為空時,轉(3);
(3)堆疊非空時,從堆疊中退出乙個節點的指標。如果退出的節點的進棧標誌為true,說明該節點是第二次退棧,訪問該接點,並將指標強制設為空,準備下一次退棧,並轉(3),如果進棧標誌為false,說明該節點是第一次退棧,將進棧標誌設為true,然後將該節點指標及進棧標誌進棧,再將指標指向它的右子樹,轉(1)。
#include
#include
typedef
char etype;
struct binarytreenode
; typedef binarytreenode binarytree;
typedef
struct stype
stype;
typedef
struct stack
stack;
void creatstack(stack &s,int maxstacksize);
bool isempty(stack &s);
bool isfull(stack &s);
bool gettop(stack &s,stype &result);
bool pop(stack &s,stype &result);
bool push(stack &s,stype &x);
void creatbitree(binarytreenode **bt);
void postordernorecursive(binarytreenode *bt);
int main()
void creatstack(stack &s,int maxstacksize)
bool isempty(stack &s)
bool isfull(stack &s)
bool gettop(stack &s,stype &result)
bool pop(stack &s,stype &result)
bool push(stack &s,stype &x)
void creatbitree(binarytreenode **bt)
else
} void postordernorecursive(binarytreenode *bt)
else
else
} }
} }
二叉樹非遞迴後序遍歷
注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程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...
二叉樹後序遍歷 遞迴和非遞迴
今天剛好想到這個問題,但是不太會,就查詢後記錄一下。首先是節點類 沒有進行一些屬性的封裝,見諒!class treenode public treenode list diguires newarraylist 遞迴進行後序遍歷 直接就先左,右,中順序遞迴呼叫即可 public list digui...