可以巧妙的用两个栈来实现后序遍历的非递归算法。注意到后序遍历可以看作是下面遍历的逆过程:即先遍历某个结点,然后遍历其右孩子,然后遍历其左孩子。这个过程逆过来就是后序遍历。算法步骤如下:
1,Push根结点到第一个栈s中。
2,从第一个栈s中Pop出一个结点,并将其Push到第二个栈output中。
3,然后Push结点的左孩子和右孩子到第一个栈s中。
4,重复过程2和3直到栈s为空。
5,完成后,所有结点已经Push到栈output中,且按照后序遍历的顺序存放,直接全部Pop出来即是二叉树后序遍历结果。
代码(参见《二叉树的非递归中序遍历以及层序遍历实现》):
void PostOrder2(BTree T)
{
if(!T)
return;
LinkStack s,t;
InitStack(&s);
InitStack(&t);
Push(&s,T);
while(!(Isempty(s)))
{
BTree ptr;
Pop(&s,&ptr);
Push(&t,ptr);
if(ptr->lChild)
Push(&s,ptr->lChild);
if(ptr->rChild)
Push(&s,ptr->rChild);
}
while(!(Isempty(t)))
{
Pop(&t,&T);
cout<<"Node : "<<T->data<<endl;
}
Destroy(&s);
Destroy(&t);
}
REF:
1,http://blog.csdn.net/sgbfblog/article/details/7773103