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

文章目录

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


前言

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

树节点:

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 无法消除…

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…

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

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

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; 向上调整&…

【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;并且体验到更加逼…

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

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

数据可视化-ECharts Html项目实战(5)

在之前的文章中&#xff0c;我们学习了如何设置滚动图例&#xff0c;工具箱设置和插入图片。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢 数据可视化-ECharts…

Vue3 + Django 前后端分离项目实现密码认证登录

1、功能需求 通常中小型前后端项目&#xff0c;对安全要求不高&#xff0c;也可以采用密码认证方案。如果只用django来实现非常简单。采用 Vue3 前后端分离架构&#xff0c;实现起来稍繁琐一点&#xff0c;好处是可以利用各种前端技术栈&#xff0c;如element-plus UI库来渲染…

Git Commit 提交规范,变更日志、版本发布自动化和 Emoji 提交标准

前言 Git Commit 是开发的日常操作, 一个优秀的 Commit Message 不仅有助于他人 Review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是实际工作中却常常被大家忽略&#xff0c;希望通过本文&#xff0c;能够帮助大家规范 Git Commit&#xff0c;并且展示相关 …

Mongodb入门到入土,安装到实战,外包半年学习的成果

这是我参与「第四届青训营 」笔记创作活动的的第27天&#xff0c;今天主要记录前端进阶必须掌握内容Mongodb数据库,从搭建环境到运行数据库,然后使用MongodB; 一、文章内容 数据库基础知识关系型数据库和非关系型数据库为什么学习Mongodb数据库环境搭建及运行MongodbMongodb命…

【进程概念】启动进程 | 查看进程 | 创建进程

目录 启动进程 查看进程 方法1&#xff1a;/proc 方法2&#xff1a;查看脚本 ​方法3&#xff1a;系统调用获取进程标示符❗❗ 终止进程 创建进程&#xff08;主fork) &#x1f642;查看父子进程的pid &#x1f642;进程创建/执行/终止 &#x1f642;多次重新启动进…

STM32 CAN的工作模式

STM32 CAN的工作模式 正常模式 正常模式下就是一个正常的CAN节点&#xff0c;可以向总线发送数据和接收数据。 静默模式 静默模式下&#xff0c;它自己的输出端的逻辑0数据会直接传输到它自己的输入端&#xff0c;逻辑1可以被发送到总线&#xff0c;所以它不能向总线发送显性…

鸿蒙开发实战:网络请求库【axios】

简介 [Axios] &#xff0c;是一个基于 promise 的网络请求库&#xff0c;可以运行 node.js 和浏览器中。本库基于[Axios]原库v1.3.4版本进行适配&#xff0c;使其可以运行在 OpenHarmony&#xff0c;并沿用其现有用法和特性。 http 请求Promise APIrequest 和 response 拦截器…