后序遍历中,二叉树的根节点需要其左右子树都遍历结束后才能访问,需要两个栈来辅助解决,一个栈来存放所经过的根节点的指针,另一个辅助栈用来记录谋根节点被路过的次数。
void BinaryTree::LastOrder(Node* Current)//非递归的后序遍历
{
stack<Node*>vis;//保存经过的根节点
stack<int>vistime;//记录每个节点访问次数,当次数为3时才输出
Node* q=Current;
while(q!=NULL||!vis.empty())
{
while(q!=NULL)
{
vis.push(q);
vistime.push(1);//第一次路过
q=q->lchild;
}
if(!vis.empty())
{
if (vistime.top()==1)
{
vistime.top()=2;//第二次路过
q=vis.top();
q=q->rchild;
}
else
{
q=vis.top();//第三次路过时访问
vis.pop();
vistime.pop();
cout<<q->info<<"\t";
q=NULL;
}
}
}
}