1、基本思路
Step1:向左下遍历,元素依次入栈,直到左孩子为空
Step2:弹出栈顶元素,若其右孩子为空或已访问,则访问该元素;否则对其右孩子结点重复step1、step2
2、伪代码
// 后序遍历非递归算法
void PostOrder(Bitree T) {
InitStack(S); // 栈S用于记录遍历过程
BiTree p = T, q; // p为遍历指针,q用于记录p的右孩子的访问情况,若无右孩子则为NULL,否则指向p的右孩子
int flag;
do {
while(p) { // 一直向左下遍历
Push(S,p);
p = p->left;
}
flag = 1;
q = NULL;
Pop(S,p);
while(!isEmpty(S) && flag) {
/*q两个可能的取值,NULL或已访问结点,
意味着当前结点p的右孩子要么为空要么已经访问,
因此下一个访问的就是p结点*/
if(p->rchild == q) {
visit(p); // 访问p结点
q = p; // 记录该结点
Pop(S,p);
} else { // 说明p右孩子还未访问
p = p->rchild;
flag = 0; // 以p(未访问结点)为根还需找到最左下结点,因此flag置为0,跳出循环
}
}
} while(!isEmpty(S))
}