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

文章目录

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


前言

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

树节点:

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;}elsetmp = NULL;}}}

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

图解:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式仿真平台

嵌入式仿真实验教学平台 (puliedu.com) 这个平台可以写代码&#xff0c;元件拖一下就行&#xff0c;但是就是用的是标准库&#xff0c;自己一般写的hal库程序用不了&#xff0c;但是新手用还是可以的

I2C系列(三):软件模拟I2C读写24C04

一.目标 PC 端的串口调试软件通过 RS-485 与单片机通信&#xff0c;控制单片机利用软件模拟 I2C 总线对 EEPROM&#xff08;24C04&#xff09; 进行任意读写。 二.RS-485简述 在工业控制领域&#xff0c;传输距离越长&#xff0c;要求抗干扰能力也越强。由于 RS-232 无法消除…

快速入门Kotlin①基本语法

前言 23年底读了一遍“Kotlin官方文档”&#xff0c;官方文档大而全&#xff0c;阅读下来&#xff0c;大有裨益。 此系列文章的目的是记录学习进程&#xff0c;同时&#xff0c;若能让读者迅速掌握重点内容并快速上手&#xff0c;那就再好不过了。 函数 带有两个 Int 参数、…

JDBC复习

JDBC 1.注册驱动 // new的这个driver具体选择&#xff1a; // 驱动版本8以上的&#xff0c;选择mysql.cj.jdbc.Driver // 以下得&#xff0c;选择mysql.jdbc.Driver DriverManager.registerDriver(new Driver())// 一般使用反射&#xff0c;来注册驱动&#xff0c;也便于直接…

CSS3 中的盒模型:标准与IE盒模型的差异

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

2、Jenkins持续集成-gitlab安装和源码上传

文章目录 1、Gitlab代码托管服务器安装2、源代码上传托管 环境&资源准备 统一采用VMware中安装CentOS7&#xff0c;安装教程&#xff0c;统一设置静态IP资源包都存在于我的资源里面 资源版本&位置 名称机器IP软件代码托管服务器192.168.2.100Gitlab-12.4.2持续集成服…

Polar 2024春季个人挑战赛 Jay17 WP

Polar 2024春季个人挑战赛 Rank&#xff1a;7 【WEB】机器人 开题 起手敏感文件robots.txt 【WEB】PHP反序列化初试 最简单的php反序列化 POC&#xff1a; <?php class Easy{public $name;public function __wakeup(){echo $this->name;} } class Evil{public $evi…

Android studio 简单入门程序

1. 创建一个新的 Android Studio 项目。 2. 在activity_main.xml布局文件中添加一个 TextView 控件&#xff0c;用于显示文本。 3. 在对应的 Activity 类&#xff08;例如 MainActivity.java&#xff09;中&#xff0c;获取 TextView 控件并设置文本内容。 以下是示例代码&…

手机实时监控电脑屏幕(手机可以看到电脑在干什么吗)

已经2024年了&#xff0c;假如你还在问我&#xff0c;手机可以看到电脑在干什么吗&#xff0c;有没有手机实时监控电脑屏幕的系统。 那么证明&#xff0c;你可能已经out 了。 现代科技告诉发展的态势下&#xff0c;这种技术已经很成熟了。 域智盾软件就可以实现这种效果↓我们…

Python爬虫之urllib库

1、urllib库的介绍 可以实现HTTP请求&#xff0c;我们要做的就是指定请求的URL、请求头、请求体等信息 urllib库包含如下四个模块 request&#xff1a;基本的HTTP请求模块&#xff0c;可以模拟请求的发送。error&#xff1a;异常处理模块。parse&#xff1a;工具模块&#x…

Chapter 2. A simple interconnection network

A Simple Interconnection Network 一个简单的互连网络 2.1 网络规范和约束2.2 拓扑2.3 路由2.4 流量控制2.5 路由器设计性能分析 A Simple Interconnection Network 一个简单的互连网络 我们将研究简单互连网络的架构和设计&#xff0c;以提供全局视图。我们将研究最简单的…

【数据结构初阶】之堆(C语言实现)

数据结构初阶之堆&#xff08;C语言实现&#xff09; &#x1f30f; 堆的概念&#x1f30f; 堆的模拟实现&#x1f413; 堆的结构和方法接口&#x1f413; 堆的方法的模拟实现&#x1f64a; 堆的初始化&#x1f64a; 堆的构建&#x1f64a; 堆的插入&#x1f64a; 向上调整&…

Postgresql中常见的执行计划解释

PostgreSQL中的执行计划&#xff08;或查询计划&#xff09;是数据库管理系统用来详细说明如何执行特定SQL查询的一系列操作步骤。简单来说&#xff0c;执行计划就是数据库如何解读你的SQL语句&#xff0c;并决定最有效率的方式去检索或更新所需数据的蓝图。 执行计划对于性能优…

【SysBench】OLTP 基准测试示例

前言 本文采用 MySQL 沙盒实例作为测试目标&#xff0c;使用 sysbench-1.20 对其做 OLTP 基准测试。 有关 MySQL 沙盒的更多信息&#xff0c;请参阅 玩转 MySQL Shell 沙盒实例&#xff0c;【MySQL Shell】6.8 AdminAPI MySQL 沙盒 。 1、部署一个 MySQL 沙盒实例 使用 mysq…

指尖论文怎么用 #经验分享#学习方法

指尖论文是一款优秀的论文写作、查重降重工具&#xff0c;被广泛认可为高效、可靠、方便的辅助工具。那么&#xff0c;如何正确地使用指尖论文呢&#xff1f; 首先&#xff0c;用户需要注册一个指尖论文的账号&#xff0c;并登录到平台上。注册过程非常简单&#xff0c;只需要输…

瑞芯微RK3576|触觉智能:开启科技新篇章

更多产品详情可关注深圳触觉智能官网&#xff01; “瑞芯微&#xff0c;创新不止步&#xff01;”——全新芯片RK3576即将震撼登场。指引科技风潮&#xff0c;创造未来无限可能&#xff01;这款芯片在瑞芯微不断创新和突破的道路上&#xff0c;不仅是对过往成就的完美延续&…

V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆

未来&#xff0c;VR元宇宙平台可能会呈现出以下发展趋势和可能性&#xff1a; 全面融合现实与虚拟世界&#xff1a; VR元宇宙平台将更加无缝地融合现实世界和虚拟世界&#xff0c;用户可以在虚拟环境中进行各种活动&#xff0c;与现实世界进行互动&#xff0c;并且体验到更加逼…

Golang基础 Label标签与goto跳转

使用方法 Label 和goto是必须的 Label可以声明再函数体的任何地方 Label的作用范围是在函数体中 Label在嵌套函数(闭包)是不可用的. 不管是在闭包里调用闭包外的Label, 还是在闭包外调用闭包里的Label 变量的声明必须在goto之前 示例 package mainimport "fmt"…

数据仓库建模方法万字详解

在数据仓库的建设过程中&#xff0c;数据建模是至关重要的一环。它决定了数据仓库的结构和性能&#xff0c;直接影响到数据分析和决策的效率和准确性。在进行数据建模之前&#xff0c;必须对企业进行全面的业务梳理。通过建立业务模型&#xff0c;我们可以全面了解企业的业务架…

FileZilla 链接服务器提示 20 秒连接超时

FileZilla 有个默认设置是如果 20 秒没有数据的话会自动中断链接。 Command: Pass: **************** Error: Connection timed out after 20 seconds of inactivity Error: Could not connect to server修改配置 这个配置是可以修改的&#xff0c;修改的步骤为&#xff1a; …