//非递归算法后序遍历二叉树
void PostOrder1(BTNode *b)
{
BTNode *St[MaxSize];BTNode *p;int top = -1; //建立栈并初始化
BTNode *r; //保存前一个访问的结点
bool flag;
p = b; //p指向根节点
do
{
while(p != NULL) //读取当前结点及其所有左下结点
{
St[++top] = p;
p = p->lchild;
}
r = NULL; //每一次循环开始,初始化r
flag = true; //表示当前处理的是栈顶结点
while(top != -1 && flag)
{
p = St[top]; //取栈顶元素
if(p->rchild == r) //当前栈顶元素右孩子已经被访问过或者为空,说明右子树遍历完,然后访问当前结点并出栈
{
cout<<p->data;
r = p;
top--;
}
else //转向右子树
{
p = p->rchild;
flag = false; //表似乎当前处理的是右子树
}
}
}while(top != -1);
}