二叉树的非递归遍历(统一的模板)

本文详细介绍了二叉树的四种遍历方式——先序、中序、后序和层次遍历的非递归算法,并提供了C语言的实现。通过链式栈和队列,实现了在没有内置栈和队列支持下的遍历。对于后序遍历,特别解释了如何避免重复访问节点的问题。
摘要由CSDN通过智能技术生成

前言

以下是本博主用c语言创建栈和队列的博文

在二叉树遍历的时候,默认是先左子树后右子树。先,中,后是针对什么时候读取根节点而言的。

先序,中序与后序都需要借助栈来实现。对于c没有栈,所以本博主在代码中的栈是自己用c语言写的栈(链式栈),你们也可以依照自己的来改。在c++中就可以直接用STL中的了。

先序与中序的非递归过程可以通过这个图片来理解。

在这里插入图片描述

后序的非递归过程可以通过这个图片来理解。

在这里插入图片描述

树的存储结构

//树的节点
typedef struct BiTNode {
   
	char data;
	struct BiTNode* left, * right;
}BiTNode,*BiTree;

先序遍历

先序的递归遍历

/* 先序遍历*/
//递归算法
void PreOrder(BiTree T) {
   
	
	if (T) {
   
		printf("%c ", T->data);
		PreOrder(T->left);
		PreOrder(T->right);
	}
}

先序的非递归遍历

算法思路

  • 先将根节点压入栈中,用一个工作指针node(初始值为根节点)
  • 步骤1 遍历当前节点node的左子树,直到左子树为空。(在这里输出)
  • 步骤2 弹出栈顶的空指针
  • 步骤3 如果栈没有空,将栈顶元素弹出赋值给node,将node->right压入栈

代码:

void PreOrder_S(BiTree T) {
   
	if (!T) return;
	LinkStack S = (SNode*)malloc(sizeof(SNode));
	init(S);//初始化链式栈,使其置为空
	Push_L(S, T); //将根节点压入
	BiTNode* node = Top_L(S); 
	while (!empty(S)) {
   
		// 一直往左子树方向走,直到遇到空的节点
		while (node) {
   
			printf("%c ", node->data);
			node = node->left; //置当前节点为其左子树
			Push_L(S, node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值