二叉树遍历:递归方法与非递归方法——递归程序修改为非递归的方法

本文介绍了如何将递归的二叉树遍历(前序、中序、后序)转换为非递归实现,重点讲解了非递归求解二叉树高度的方法。通过理解递归程序中需要进栈的元素,如节点、返回地址、局部变量和返回值,可以成功实现这一转换。文章提供了具体的代码示例,包括先序、中序、后序遍历及求树高度的非递归算法。
摘要由CSDN通过智能技术生成

前天去美团面试,二面基本一路顺风,后来,碰到一个用非递归的方法求解二叉树高度,并要求现场写程序,一下就卡住了,非常不爽。这两天把这个部分恶补了一下,总结了一下思路如下。

1、考虑清楚解题类似于遍历中的前序 or 中序 or 后续;

2、考虑清楚在递归程序中,每次会有哪些内容需要进栈:节点本身、返回地址(用于告诉程序返回后应该从何处执行)、局部变量、返回值。

下面先上代码,并比较得出思路。


首先,我们看一下先序遍历的递归和非递归程序:

void PreTraverse(CNode *subTree, bool (*Visit)(CNode *))
	{
		if (subTree)
		{
			Visit(subTree);
			PreTraverse(subTree->lchild, Visit);
			PreTraverse(subTree->rchild, Visit);
		}
	}
void PreTraverseNonRecursive(CNode *subTree, bool (*Visit)(CNode *)) 
// 你会把这个函数按照后边的形式简化吗^^这个函数来源于网络,个人认为写的比较繁琐。你可以使用三个case简化。
	{
		std::stack<CNode*> s;
		CNode *t = subTree;
		s.push(t);
		while (!s.empty())
		{
			while (!s.empty()) // go left until the most left child
			{
				t = s.top(); // notice: without pop!!
				if (!t)break;
				Visit(t);
				s.push(t-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值