文库文章:http://wenku.baidu.com/link?url=9FJf0djV7G79YXSqRhQK3m52pm_EpCleUH3eaCZzm31F6VhroWcZI2nhxQn8ZQQ4ceItQBZfBB__iq1BLTJUgTvM0vA5oce55HGNfSh3CG7###
二叉树前序遍历:根----左结点----右结点 所以在访问到一个节点不为空时:先访问此结点,然后把此结点的非空右孩子先入栈,然后再把非空左孩子入栈。
具体代码如下:
二叉树后序非递归算法; http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html
第二种思路:要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
void postOrder3(BinTree *root) //非递归后序遍历
{
stack<BinTree*> s;
BinTree *cur; //当前结点
BinTree *pre=NULL; //前一次访问的结点
s.push(root);
while(!s.empty())
{
cur=s.top();
if((cur->lchild==NULL&&cur->rchild==NULL)||
(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
{
cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩子节点都已被访问过
s.pop();
pre=cur;
}
else
{
if(cur->rchild!=NULL)
s.push(cur->rchild);
if(cur->lchild!=NULL)
s.push(cur->lchild);
}
}
}