百度一下就可以知道答案了。直接搜”二叉树的前序遍历和后序遍历的算法“
第一条就是:
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
。
。
。
剩下步骤的自己来吧!
实际上,递归也是在操作堆栈。
一般的书上应该有这么类似的话:
“利用一个辅助堆栈,可以将递归算法转化为等价的分递归算法”
*/
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。