二、(3)二叉树的后序遍历(递归实现、迭代实现)

二叉树本来是分层结构,但若施加某种约束(如遍历),则可以转变成线性结构。

二叉树的遍历方法主要有:前序遍历(DLR),中序遍历(LDR),后序遍历(LRD),层次遍历。本文主要介绍二叉树后序遍历方法,其中包括了递归和迭代两种实现方式。

后序遍历:左子树->右子树->根节点(根节点在最后面

例如:

                                   

上图所示的二叉树的后序遍历顺序为:6 3 4 1 7 5 2 0

本文使用的二叉树数据结构参见之前博客:https://blog.csdn.net/qq_18108083/article/details/84727888

(1) 递归版本(简洁易懂,但是递归过程会导致函数调用栈的频繁进栈出栈,时间复杂度高,而且每次递归均重复定义变量,且保存现场也需要额外的空间,所以空间复杂度也高)

template<typename T> void binTree<T>::travPost_R(binNode<T>* bn_r, void(*func)(T& bn))
{
	if (!bn_r) return;
	travPost_R(bn_r->lc, func);
	travPost_R(bn_r->rc, func);
	func(bn_r->data);
}

(2) 迭代版本(相对于递归版本,其等效的迭代版本具有更小的时间复杂度和空间复杂度,这也是一般算法推荐迭代版本的原因,但是迭代版本的实现相对更加复杂)

template<typename T> void binTree<T>::gotoHLVFL(stack<binNode<T>*> &s)
{
	while (binNode<T>* bn_i = s.top())
	{
		if (bn_i->lc)
		{
			if (bn_i->rc)
				s.push(bn_i->rc);
			s.push(bn_i->lc);
		}
		else
		{
			s.push(bn_i->rc);
		}
	}
	s.pop();
}

template<typename T> void binTree<T>::travPost_I(binNode<T>* bn_i, void(*func)(T& bn))
{
	stack<binNode<T>*> S;
	if (bn_i)
		S.push(bn_i);
	while (!S.empty())
	{
		if (S.top() != bn_i->parent)
			gotoHLVFL(S);
		bn_i = S.pop();
		func(bn_i->data);
	}
}

运行结果:

  

总结:二叉树前序遍历的上述递归方式和迭代方式都能实现正确的遍历,递归版本容易理解,但是效率会略低,当然一般也是可以忽略的,而迭代版本效率上会有所提升,相对之下更加难懂,具体选择哪种根据需要吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值