后序遍历的操作如下:
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; } } } }