数据结构 - 二叉树非递归遍历

文章目录

  • 前言
    • 一、前序
    • 二、中序
    • 三、后序


前言

本文实现二叉树的前中后的非递归遍历,使用栈来模拟递归。
文字有点简略,需要看图和代码理解

树节点:

typedef char DATA;
//树节点
typedef struct Node
{
	DATA data;	//数据
	struct Node* left;	//左子树
	struct Node* right;	//右子树
	bool ok;	//判断完成左子树遍历 ,用于后序遍历
	Node(DATA d)
	{ data = d;
	left = right = NULL;
	ok = true;
	}
}Node;

手搓树:

/构建树
void Tree::Achievements()
{
	Node*  p1 = new Node('a');

	Node* p2 = new Node('b');

	Node* p3 = new Node('c');

	Node* p4 = new Node('d');

	Node* p5 = new Node('e');


	p1->left = p2;
	p1->right = p3;
	p2->right = p4;
	p3->left = p5;

	this->root = p1;
}

一、前序

前序遍历:先根后左右子树
我们通过栈来模拟递归过程:
根据栈的特点:先进先出,所以我们先然右子树进栈再让左子树进栈,这样就符合前序遍历了
代码实现:

//前序遍历 : 根 -> 左子树 -> 右子树
void Tree::Preamble()
{
	//利用栈实现
	stack<Node*> sta;
	//判断是否为空
	if (this->root == NULL)
	{
		return;
	}
	//根先入栈
	sta.push(this->root);

	//当栈空时说明已经遍历完了
	while (!sta.empty())
	{
		//取栈顶元素并出栈
		Node* tmp = sta.top();
		sta.pop();
		cout << tmp->data << "->";

		//因为栈的特点:先进先出,所以先压右子树,在压左子树,这样就可以做到先左子树了
		if (tmp->right != NULL)
		{
			sta.push(tmp->right);
		}
		if (tmp->left != NULL)
		{
			sta.push(tmp->left);
		}
	}
}

运行结果:
在这里插入图片描述
图解:
在这里插入图片描述

二、中序

中序遍历:先左子树再根最后右子树
依旧用模拟栈来实现:先让左子树先出完再出根再右子树
代码实现:

//中序遍历 :先左子树,再根,最后右子树
void Tree::MediumOrder()
{
	//判断是否为空
	if (this->root == NULL)
	{
		return;
	}
	//栈
	stack<Node*> sta;
	//先进根
	sta.push(this->root);
	Node* tmp = this->root;

	//出循环条件
	while (!sta.empty()&&tmp!=NULL)
	{
		//左不为空就进左
		if (tmp->left != NULL)
		{
			sta.push(tmp->left);
			tmp = tmp->left;
		}
		//直到左为空了,开始出栈
		else if (tmp->left == NULL)
		{
			//取栈顶并出栈
			tmp = sta.top();			
			sta.pop();
			cout << tmp->data << "->";

			//右子树为空就说明这个子树遍历完了,可以回到上一级根了(栈顶元素),再判断其右子树是否为空
			while (!sta.empty()&&tmp->right == NULL)
			{
				tmp = sta.top();
				cout << tmp->data << "->";
				sta.pop();
			}
			//右子树不为空进栈,并作为新的根,再往下走
				sta.push(tmp->right);
				tmp = tmp->right;
		}
	}
}

运行结果:
在这里插入图片描述
图解:
在这里插入图片描述

三、后序

后序:先左子树再右子树最后根
还是用栈来模拟,但是在树节点加了一个bool变量来判断是否走完左子树了,判断为假的话就该走右子树了。

代码实现:

后序遍历:左子树再右子树最后根
void Tree::Postscript()
{
	//判断是否为空
	if (this->root == NULL)
	{
		return;
	}
	//栈
	stack<Node*> sta;
	//先让根入栈
	Node* tmp = this->root;
	sta.push(tmp);
	
	//从根的左节点开始
	tmp = tmp->left;

	while (!sta.empty() || tmp != NULL)
	{
		//不为空就继续进栈,直到为空
		while (tmp != NULL)
		{
			sta.push(tmp);
			tmp = tmp->left;
		}

		//左子树为空,取栈顶元素并出栈
		tmp = sta.top();
		sta.pop();

		//判断为真改变为假再入栈
		if (tmp->ok)
		{
			tmp->ok = false;
			sta.push(tmp);
			//栈顶元素为ok假了,该走右了
			tmp = tmp->right;
		}
		//假,将栈顶往下为假的元素都出,直到为真的再重新走
		else
		{   
			cout << tmp->data << "->";
			//遍历到根节点了
			if (tmp == this->root)
			{
				return;
			}
			else
				tmp = NULL;
		}
	}
	}

运行结果:
在这里插入图片描述

图解:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/482304.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的物资仓储物流管理系统(源码+论文)

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

数据治理的迷失:揭开“屎上雕花”现象的真相

数据治理是企业信息化建设的核心环节&#xff0c;它直接关系到数据的质量、安全性和价值实现。然而&#xff0c;在实际操作中&#xff0c;不少企业却陷入了“屎上雕花”的误区&#xff0c;即在数据本身存在问题的情况下&#xff0c;试图通过表面的修饰来提升数据的外在表现&…

QT:三大特性

QT的三大特性&#xff1a; 1、信号与槽 2、内存管理 3、事件处理 1、信号与槽 当信号产生时&#xff0c;就会自动调用绑定的槽函数。 自定义信号: 类中需要添加O_OBJECT宏 声明: signals标签之下进行声明 定义&#xff1a; 信号不需要定义 …

使用 PyOpenGL 进行 2D 图形渲染总结

一、说明 OpenGL是一个广泛使用的开放式跨平台实时 3D 图形库&#xff0c;开发于二十多年前。它提供了一个低级API&#xff0c;允许开发人员以统一的方式访问图形硬件。在开发需要硬件加速且需要在不同平台上运行的复杂 2D 或 3D 应用程序时&#xff0c;它是首选平台。它可以在…

Day 14 JDBC

JDBC 1、简单入门 Statement2、preparedStatement3、主键回显4、批量操作5、事务6、Druid6.1 工具类V16.2 工具类V26.3 1、简单入门 Statement 步骤: 1、注册驱动 2、创建连接 3、创建 Statement对象 4、编写sql语句 并且发送sql语句获得结果集 5、解析结果集 6、释放资源 注意…

1、Dev软件的安装

预先善其事,必先利其器,想要学习编程语言的第一步就是学会使用编译软件,在这里我们所使用的编译软件为 Dev-cpp 5.11 ,在这一章节,我们将讲述如何下载并安 Dev-cpp 5.11。 一、下载 首先,我们要先学会下载 Dev-cpp 5.11,这里我们点击:Dev-cpp 5.11,即可完成下载,注…

Appium —— 移动应用自动化测试开源工具!

Appium介绍 Appium是一个用于自动化移动应用程序的开源工具&#xff0c;它支持iOS和Android平台。通过Appium&#xff0c;开发人员可以使用各种编程语言&#xff08;如Java、Python、Ruby等&#xff09;编写测试脚本&#xff0c;以自动化测试移动应用程序的功能和用户界面。Ap…

pytest运行结果解析及其改造

简介&#xff1a;场景假设 - 当运行pytest完成后&#xff0c;需要针对运行的结果进行即时的反馈&#xff0c;打印 PASS 或者 FAIL&#xff0c;及其运行失败的原因&#xff0c;最后将结果推送给消息机器人。 历史攻略&#xff1a; pytestallure安装和使用 pytest&#xff1a;…

C# 对App.config、Web.config的appSettings节点数据进行加密

appSettings加密原因&#xff0c;就是因为容易暴露服务器账号和密码&#xff0c;而且客户也不允许 使用ASP.NET提供的命令工具aspnet_regiis来创建加密命令&#xff1b;aspnet_regiis是提供了直接对配置文件加密的功能的&#xff1b;并且使用aspnet_regiis加密的配置节点在读取…

贪吃蛇(C语言超详细版)

目录 前言&#xff1a; 总览&#xff1a; API&#xff1a; 控制台程序&#xff08;Console&#xff09;&#xff1a; 设置坐标&#xff1a; COORD&#xff1a; GetStdHandle&#xff1a; STD_OUTPUT_HANDLE参数&#xff1a; SetConsoleCursorPosition&#xff1a; …

Springboot测试找不到bean

1.没有加注解 service类上需要加注解 2.Test类引用错误 3.测试类与我们使用的包名不同&#xff0c;两个都是com.travel才可以&#xff0c;否则扫描不到 4.引入的启动类错误 5.不是很确定&#xff0c;但是也是我犯的错误 6.没有配置好XML文件 有的话再补充

【并发编程】锁相关公平锁和非公平锁?可重入锁锁的升级乐观锁和悲观锁版本号机制CAS 算法乐观锁有哪些问题?

目录 ​编辑 锁相关 公平锁和非公平锁&#xff1f; 可重入锁 锁的升级 乐观锁和悲观锁 版本号机制 CAS 算法 乐观锁有哪些问题&#xff1f; 锁相关 公平锁和非公平锁&#xff1f; 公平锁 : 锁被释放之后&#xff0c;先申请的线程先得到锁。性能较差一些&#xff0c;因…

Nacos介绍和统一配置管理

Nacos&#xff08;全称为 Alibaba Cloud Nacos&#xff0c;或简称为 Nacos&#xff09;是一个开源的分布式服务发现和配置管理系统。它由阿里巴巴集团开发并开源&#xff0c;旨在帮助开发人员简化微服务架构下的服务注册、发现和配置管理。 一、Nacos 提供了以下主要功能&…

Deconstructing Denoising Diffusion Models for Self-Supervised Learning

开头说点题外话&#xff1a;这篇可谓是大咖云集啊&#xff0c;刘壮、谢赛宁、何凯明这些耳熟能详的名字&#xff0c;并且这篇论文一些人也觉得分析特别到位&#xff0c;不愧是大佬视角&#xff0c;配得上“解构”两个字&#xff1b;很巧的是&#xff0c;本科阶段的团队导师也是…

什么是虚拟继承

由于C支持多继承&#xff0c;除了public、protected和private三种继承方式外&#xff0c;还支持虚拟&#xff08;virtual&#xff09;继承&#xff0c;举个例子&#xff1a; #include <iostream> using namespace std;class A {}; class B : virtual public A {}; class…

大学形势与政策~秋试题及答案,分享几个实用搜题和学习工具 #媒体#笔记

大学生必备&#xff0c;这条笔记大数据一定定要推给刚上大学的学弟学妹&#xff01;&#xff01; 1.白鸽搜题 这个是公众号 超强题库资源&#xff0c;涵盖行业单位、学历提升等各类考试。解题更轻松&#xff0c;学习更高效。 下方附上一些测试的试题及答案 1、外部招募的主…

【数据库】聚合函数

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

虚拟机Ubuntu无法识别U盘

1. 现象 虚拟机插入U盘后&#xff0c;无反应。系统中也找不到U盘。 2. 原因 VMware USB Arbitration Service服务别关闭了&#xff0c;任务管理器中找不到该任务。 服务中也没有运行&#xff08;services.msc&#xff09; 3. 解决 打开服务设置窗口&#xff08;services.…

温湿度项目设计V1.0——PCB布线及打板

PCB布线 画好原理图之后&#xff0c;通过工具——标注所有器件&#xff0c;当前原理图上的器件编号会被自动标注号。点击设置——Update PCB Document文件名&#xff0c;弹出的界面先点击生效变更&#xff0c;然后点击执行变更。界面会跳转到PCB界面。如果生效变更有问题&…

城管智慧执法系统源码,基于微服务+java+springboot+vue开发

城管智慧执法系统源码&#xff0c;基于微服务javaspringbootvue开发 城管智慧执法系统源码有演示&#xff0c;自主研发&#xff0c;功能完善&#xff0c;正版授权&#xff0c;可商用上项目。 一套数字化的城管综合执法办案系统源码&#xff0c;提供了案件在线办理、当事人信用…