百度一下就可以知道答案了。直接搜”二叉树的前序遍历和后序遍历的算法“
第一条就是:
http://blog.csdn.net/sky04/article/details/4510266
我只解释一下先序遍历非递归算法,其他的自学一下吧。:
//先序遍历非递归算法 void PreOrderUnrec(Bitree *t)
{
Stack s;
StackInit(s); //初始化
Bitree *p=t; // 二叉树根节点
while (p!=NULL || !StackEmpty(s))
{
while (p!=NULL) //遍历左子树
{
visite(p->data);
push(s,p);
p=p->lchild; //lchild 左子树
}
if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历
{
p=pop(s);
p=p->rchild; //rchild 右子树
}//endif
}//endwhile
}
/* Stack s ;创建堆栈。这也是堆栈的一个应用。既然你已经学到了二叉树,就应该知道堆栈,可以把以前编写的堆栈程序拿来用。
POP,PUSH 堆栈的弹出,压栈。
按照该程序步骤,来演示 s 和指针 p 的内容:(完全二叉树为例)
前序遍历次序为:ABCDEFG
1.第一次执行 while语句后
栈 s[底部,ABC] p=NULL 访问了 :ABC节点
2.第一次执行 if
栈 s[底部,AB] p=NULL 访问了 :ABC节点 由于c的右子树为空,所以p=NULL
3.第二次跳过了 while
4.第二次执行 if
栈 s[底部,A] p指向了D 访问了:ABC节点
5.第三次执行 while语句后
栈 s[底部,AD] p=NULL 访问了:ABCD节点,本次while循环,只访问了D
。
。
。
剩下步骤的自己来吧!
实际上,递归也是在操作堆栈。
一般的书上应该有这么类似的话:
“利用一个辅助堆栈,可以将递归算法转化为等价的分递归算法”
*/