二叉树系列(2)前序中序后序遍历的递归和非递归实现

递归地对二叉树进行遍历的做法比较好理解。有一颗树,长成这个样子。


下面分别是对它进行三序遍历的结果:


前序递归

//前序递归
void pre_order(link t, void (*visit)(link))
{
	if(!t)
		return;
	visit(t);
	pre_order(t->l, visit);
	pre_order(t->r, visit);
}
前序遍历输出结果




中序递归

//中序递归
void in_order(link t, void (*visit)(link))
{
	if(!t)
		return;
	in_order(t->l, visit);
		visit(t);	
	in_order(t->r, visit);
}
中序遍历输出结果



后序递归

//后序递归
void post_order(link t, void (*visit)(link))
{
	if(!t)
		return;
	post_order(t->l, visit);
	post_order(t->r, visit);
	visit(t);	
}
后序遍历输出结果



递归的写法非常直观好理解。比较困难的是非递归的写法。而且,比较不对称的结果是,三种顺序的非递归写法的难度是不同的。容易程度是,前序>中序>后续。

先从最容易的非递归前序遍历开始。基本思路是,维护一个栈。对于当前节点,输出它,然后依次入栈当前节点的右儿子,左儿子,然后弹栈。不断进行这个过程直到栈空。

//前序非递归
void pre_order_2(link t, void (*visit)(link))
{
	if(t==NULL)
		return;
	std::stack<link> s;    	
	link p = t;	
	s.push(p);
    while(!s.empty())
    {
        p &#
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值