后序遍历的操作如下:
1)后序遍历左子树;
2)后序遍历右子树;
3)访问根节点;
对应的递归算法如下:
void PostOrder(Bitree T) {
if (T != NULL) {
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
非递归算法算法思想:当用堆栈来存储结点时,必须分清返回根结点时是从左子树返回的
还是从右子树返回的。所以,使用辅助指针r,指向其最近访问过的结点。也可在结点
增加一个标志域,记录是否已被访问。
对应的非递归算法如下:
void PostOrder(Bitree T) {
InitStack(S);
p = T;
r = NULL;
while (p || !IsEmpty(S)) {
if (p) {
push(S, p);
p = p->lchild;
}
else {
Get(S, p);
if (p->rchild&&p->rchild != r) {
p = p->rchild;
push(S, p);
p = p->lchild;
}
else {
pop(S, p);
visit(p->data);
r = p;
p = NULL;
}
}
}
}