一、算法
第一步:先調(diào)用循環(huán)遍歷左子樹,同時(shí)入棧元素。
第二步:左子樹調(diào)用完成之后,訪問??臻g,對于棧頂元素判斷是否訪問過右子樹
??①若未訪問:則將p指針指向右子樹,然后對右子樹進(jìn)行 第一步 。
??②若已訪問:則棧頂元素出棧,并打印內(nèi)容
第三步:循環(huán)上述過程,直到棧為空
二、代碼
1、結(jié)構(gòu)體定義:
typedef struct node {
int data;
node *l;
node *r;
bool vis;//是否訪問過右子樹
}*Tree,node;
2、非遞歸后序遍歷函數(shù)
void stPrint(Tree tree) {
node *p = tree;
stack<node *> s;
do {
while(p!=NULL) {
p->vis = false;
s.push(p);
p = p->l;
}
while(!s.empty()) {
node *top = s.top();
if(top->vis == true) {//已經(jīng)訪問過右子樹了
cout << top->data << " ";
s.pop();
} else {//右子樹還沒訪問
p = top->r;
top->vis = true;
break;
}
}
} while(!s.empty());
}
三、參考視頻
二叉樹后序遍歷非遞歸 https://www.bilibili.com/video/BV1up411R7NB?t=752