/*
*
* 檔名稱:
postorder.c
* 檔案標識:後序非遞迴遍歷二叉樹* 摘
要:用棧模擬後序遍歷二叉樹
*
* 當前版本:
1.0 * 作
者:yu
* 完成日期:
2023年8
月8日*
* 取代版本:
1.0
* 原作者:
yu
* 完成日期:
2023年8
月8日*/
#include
#include
#define stack_init_size 100//
棧初始分配的空間數
#define stackincreament 10//
棧空間不夠時增加的空間數
typedef char datatype;//
二叉樹結點資訊型別
typedef struct bitnode//
二叉樹結點型別
bitnode;
typedef enum tagtype;//tag為l
表示將訪問該結點的左子樹,
tag為
r表示將訪問該結點的右子樹
typedef struct stacknode//
棧結點型別
stacknode;
typedef struct stack//
棧型別sqstack;
sqstack *initstack()//
建棧
if (s->base)//
分配空間成功
printf("
棧空間分配成功
!/n");
s->top = s->base;//
初始化棧的頭尾指標
s->stacksize = stack_init_size;
return s;
}void push(sqstack *s,stacknode e)//
壓棧
*(s->top) = e;
s->top++;
}stacknode pop1(sqstack *s)//出棧1
,返回的
e為棧頂元素是乙個位址
int stackempty(sqstack *s)//
判斷棧空,棧空返回
1,否則返回
0
stacknode getop(sqstack *s)//
獲得棧頂元素
bitnode *createbitree()//
先序遞迴法建樹
return t;
}void postorder(bitnode *t)
while (!stackempty(s) && (*(s->top-1)).tag == r)//
判斷tag
是否為r
。因為若是
r,則表示從右子樹返回
if (!stackempty(s))}}
void main()
資料結構 二叉樹後序遍歷(非遞迴)
後序遍歷 左 右 根 後序遍歷的順序是 左 右 根,和前 中序遍歷的不同之處在於,它在遍歷的時候,需要判斷它的右子樹是否已經被訪問過,如果已經訪問過的話,就直接取出當前節點,若沒有訪問過,則就去訪問。如果沒有這個操作,依舊和前 中序遍歷的思想一樣,就會在底部遞迴時,出現死迴圈。先將根節點入棧 若根節...
二叉樹非遞迴後序遍歷
注釋 後序非遞迴遍歷的難處就在,最右結點無法直接找到後繼結點,後序線索化二叉樹在這裡就不能使用遞迴了,其實知道了遞迴的運作過程就不難理解為何不能用遞迴後序線索化了遞迴詳細執行過程a b c d e f h 當遍歷到最左邊的時候,d沒有左右結點了,輸出d,需要返回b去遍歷b的右子樹,e沒有左右結點e輸...
後序非遞迴遍歷二叉樹
後序遍歷的非遞迴演算法中節點的進棧次數是兩個,即每個節點都要進棧兩次,第二次退棧的時候才訪問節點。第一次進棧時,在遍歷左子樹的過程中將 根 節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個 根 節點,但不能立即訪問,只能借助於這個 根 去找該 根 的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍...