一、算法
第一步:先调用循环遍历左子树,同时入栈元素。
第二步:左子树调用完成之后,访问栈空间,对于栈顶元素判断是否访问过右子树
①若未访问:则将p指针指向右子树,然后对右子树进行 第一步 。
②若已访问:则栈顶元素出栈,并打印内容
第三步:循环上述过程,直到栈为空
二、代码
1、结构体定义:
typedef struct node {
int data;
node *l;
node *r;
bool vis;//是否访问过右子树
}*Tree,node;
2、非递归后序遍历函数
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) {//已经访问过右子树了
cout << top->data << " ";
s.pop();
} else {//右子树还没访问
p = top->r;
top->vis = true;
break;
}
}
} while(!s.empty());
}
三、参考视频
二叉树后序遍历非递归 https://www.bilibili.com/video/BV1up411R7NB?t=752