借助堆栈可以实现前序遍历、中序遍历的非递归程序,而且两者的程序结构几乎一样。
那么,是否也可以借助堆栈实现后序遍历的非递归程序?是不是挪动一下printf语句就可以了?
(通过给节点增加访问次数的属性来实现,伪代码如下)
void PostOrderTraversal(Bintree BT) { //给节点增加访问次数的属性Visit,初始化为0
Bintree T BT;
Stack S = CreateStack(Maxsize);
while (T || !IsEmpty(S)) {
while (T) {
if (T->Visit == 0) {//虽然没必要判断,为便于理解
T->Visit++;
Push(S, T); //第一次入栈,不访问
}
T = T->left; //转向左子树
}
if (!IsEmpty(S)) {
T = Pop(s);
if (T->Visit == 2) {
printf("%d", T->Data);//第三次碰到它,访问节点,可以彻底从堆栈弹出了
T = NULL;//左右子数均已经访问过
}
else {
T->Visit++;
Push(S, T); //第二次入栈,不访问,(相当于T没有出栈)
T = T->Right; //转向右子树
}
}
}