二叉树系列(3)层序遍历的非递归实现

本文介绍了如何非递归地实现二叉树的层次遍历,利用队列作为数据结构来实现这一过程。由于层次遍历的特点,使用队列能够有效地进行操作。文中并未探讨递归实现层次遍历的方法,指出一些网上所谓的递归解法实为伪递归,且可能因为层次遍历的数据访问方式与递归算法不匹配,导致难以用纯递归实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照层次序实现二叉树遍历。


对于上图中的二叉树,层次遍历的实现结果如下


层次遍历的过程天然地符合队列这个数据结构,因此可以用队列方法来非递归地实现层次遍历。目前还不太清楚如何递归地实现层次遍历,网上看到的一些解法,声称采用了递归方法进行层次遍历,但是它们是在while循环中进行的递归,是一种伪递归。由此有可以猜测,可能这种遍历表现出来的数据访问方式确实不匹配递归的算法。下面仅仅给出层次遍历的非递归解法。

void level_order_2(link t, void (*visit)(link))
{
	if(!t)
		return;
	std::queue<struct node> que;	
	que.push(*t);
	
	while(!que.empty()){
		struct node node_p;		
		node_p =  que.front();
		que.pop();
		visit(&node_p);
		if(node_p.l!=NULL)
			que.push(*node_p.l);
		if(node_p.r!=NULL)
			que.push(*node_p.r);
	}
	
	return;
}

下面是完整的文件,主要实现了二叉树的前序,中序,后序,层序的遍历。有bintree.h,bintree.cpp,main.cpp

以下为bintree.h

#ifndef BINTREE_H
#define BINTREE_H
typedef struct node* link;
struct node{
	int item;
	link l,r;
};
struct tag_node{
	link node_link;
	bool is_first;
};
link init(int VLR[],int LVR[],int n);

void pre_order(link t, void (*visit)(link));//递归前续遍历
void pre_order_2(link t, void (*visit)(link));//非递归前续遍历
void in_order(link t, void (*visit)(link));//递归中续遍历
void in_order_2(link t, void (*visit)(link));//非递归中续遍历
void post_order(link t, void (*visit)(link));//递归后续遍历
void post_order_2(link t, void (*visit)(link));//非递归后续遍历第一种
void post_order_3(link t, void (*visit)(link)); //非递归后续遍历第二种
void level_order(link t, int level, void (*visit)(link));//层序遍历递归,
void level_order_2(link t, void (*visit)(link));//层序遍历非递归
int count(l
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值