C++中二叉树的非递归遍历方法2-2

news2024/11/28 11:01:14

4 代码实现二叉树的非递归遍历

在“2 二叉树的遍历方法”中提到,二叉树的遍历方法有前序遍历、中序遍历、后序遍历属于深度优先遍历。接下来以前序遍历为例,通过代码实现该方法的二叉树非递归遍历。

4.1 前序遍历

4.1.1 前序遍历的非递归步骤

因为前序遍历的输出顺序是根节点、左子树、右子树,所以以前序的方式遍历图1所示的二叉树,则输出的顺序应为“1->2->4->5->3->6”。

前序遍历的非递归的流程图如图2所示。

图2 前序遍历的非递归流程图

从图1的根节点(值为1的节点)开始,根据图2的流程图,可以得到如图3所示的步骤。

图3 前序遍历的非递归步骤图

从图3的步骤图中可知,输出的数据是“1 2 3 5 3 6”,即前序遍历。

4.1.2 前序遍历的非递归的实现

前序遍历的非递归代码如下所示。

void preOrderTraveralWithStack(TreeNode* root)

{

    stack<TreeNode*> stk;

    TreeNode* treeNode = root;

    while (treeNode != NULL || !stk.empty())

    {

        while (treeNode != NULL)

        {

            cout << treeNode->data<<endl;

            stk.push(treeNode);

            treeNode = treeNode->leftChild;

        }

        if (!stk.empty())

        {

            treeNode = (TreeNode*)stk.top();

            treeNode = treeNode->rightChild;

            stk.pop();

        }

    }

}

其中,preOrderTraveralWithStackstk()函数的参数root是起始节点,即根节点。在该函数中,stk是自定义结构TreeNode的栈,可结合图1、图2和图3理解以上代码。

在主函数中,使用“3.3 关联节点”中提到的代码创建节点和关联节点之后,调用preOrderTraveralWithStackstk()函数即可实现前序遍历。

preOrderTraveralWithStack(treenode1);

其中,treenode1是图1中的根节点。代码输出的结果如图4所示。

图4 前序遍历代码输出

4.2 中序遍历

中序遍历的输出顺序是左子树、根节点、右子树。因此,对于图1所示的节点图,采用中序遍历的输出结果是“4->2->5->1->3->6”。前序遍历的非递归的流程图如图5所示。

图5 中序遍历的非递归流程图

中序遍历实现的代码如下所示。

void inOrderTraveralWithStack(TreeNode* root)

{

    stack<TreeNode*> stk;

    TreeNode* treeNode = root;

    while (treeNode != NULL || !stk.empty())

    {

        while (treeNode != NULL)

        {

            stk.push(treeNode);

            treeNode = treeNode->leftChild;

        }

        if (!stk.empty())

        {

            treeNode = (TreeNode*)stk.top();

            cout << treeNode->data << endl;

            treeNode = treeNode->rightChild;

            stk.pop();

        }

    }

}

中序遍历的代码输出如图6所示。

图6 中序遍历代码输出

4.3 后序遍历

中序遍历的输出顺序是左子树、右子树、根节点。因此,对于图1所示的节点图,采用中序遍历的输出结果是“4->5->2->6->3->1”。前序遍历的非递归的流程图如图7所示。

图7 后序遍历的非递归流程图

后序遍历实现的代码如下所示。

void postOrderTraveralWithStack(TreeNode* root)

{

    stack<TreeNode*> stk;

    TreeNode* treeNode = root;

    TreeNode* lastVisit = nullptr;

    while (treeNode != nullptr || !stk.empty())

    {

        while (treeNode != nullptr)

        {

            stk.push(treeNode);

            treeNode = treeNode->leftChild;

        }

        if (!stk.empty())

        {

            treeNode = (TreeNode*)stk.top();

            stk.pop();

            if (treeNode->rightChild == nullptr || treeNode == lastVisit || treeNode->rightChild == lastVisit)

            {

                cout << treeNode->data << endl;

                lastVisit = treeNode;

                treeNode = nullptr;

            }

            else

            {

                stk.push(treeNode);

                treeNode = treeNode->rightChild;

            }           

        }

    }

}

后序遍历的代码输出如图8所示。

 图8 后序遍历代码输出

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

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

相关文章

记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug

记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug用到的监测工具程序简要介绍示例代码运行结果运行结果分析记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug 通过一个简单示例模拟某协程结束&a…

[附源码]Python计算机毕业设计电影院订票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

第53篇 Qt Quick项目详解

导语 前面我们一起创建了一个Qt Quick项目&#xff0c;并对里面的文件进行了简单的讲解&#xff0c;虽然这只是一个HelloWorld程序&#xff0c;但对于没有Qt Quick编程经验的同学来说&#xff0c;这个项目还是有点复杂。在这一篇中&#xff0c;我们将从最简单的QML文件讲起&am…

Flutter Web CORS解决方案1-禁用浏览器安全策略

Flutter Web CORS解决方案1设置CHROME_EXECUTABLE关于 CHROME_EXECUTABLE创建 CHROME_EXECUTABLE修改 chrome.dart 禁用安全策略升级 flutterSDK 后需重新修改升级后指定--web-hostname参数问题浏览器启用 Allow-CORS 插件部分协议OPTIONS预检跨域问题本文介绍第一种解决Flutte…

《纳瓦尔宝典》笔记一——你是在跟自己竞争,这是一场单人游戏

目录 一、身体的健康是top1 二、你唯一拥有的就是时间 三、选择短期内更更痛苦的道路 四、人生早期有三个重大决定 五、从雇佣关系中解脱出来 六、找合作伙伴 七、你真的嫉妒别人吗 八、从期待中解放出来 九、向内求-内在的评价标准 十、人生的大赢家就是同时拥有时间…

[附源码]Nodejs计算机毕业设计基于RationalRose的教务管理系统开发Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

基于java+swing+mysql图书管理系统3

大作业-基于java swing图书管理系统3一、系统介绍二、功能展示1.管理员登陆2.图书类别添加3.图书类别维护4.图书添加5.图书维护三、系统实现1.BookManageMainFrame.java四、其它1.其他系统实现五.获取源码一、系统介绍 该系统实现了用户登陆、图书类别管理(图书类别添加、图书…

JavaEE 初始化两个上下文对象,导致更新网站访问次数更新失败

问题描述 &#xff1a; 在做网站次数统计的时候&#xff0c;需要用到上下文对象&#xff0c;最终在上下文监听中发现上下文对象创建两次&#xff0c;销毁两次&#xff0c;导致数据库中网站访问次数统计更新失败。 原因 &#xff1a; 我们更改了项目的访问路径&#xff0c;就会导…

使用Java实现上传图片到七牛云

文章目录1.登录七牛云官网&#xff0c;注册账号并登录2.在项目中导入七牛云依赖3.编写创建文件名工具类4.编写连接七牛云工具类5.编写前端请求的Controller6.上传成功1.登录七牛云官网&#xff0c;注册账号并登录 2.在项目中导入七牛云依赖 <!-- 七牛云依赖 --> <!-…

力扣1832.判断句子是否为全字母句(cpp实现+解析)

文章目录1832.判断句子是否为全字母句解法一解法二解法三&#xff08;最优&#xff09;1832.判断句子是否为全字母句 难度&#xff1a;简单 力扣传送门&#xff1a; https://leetcode.cn/problems/check-if-the-sentence-is-pangram/description/ 题目要求&#xff1a; 全字…

Compose学习 -> Image()

基本使用&#xff1a; 通过资源id加载资源文件 Image(painter painterResource(id R.mipmap.test_01),contentDescription "这是内容描述") 通过url地址加载网络图片 1、引入第三方库&#xff0c;并添加网络权限 implementation ("io.coil-kt:coil-comp…

【深入浅出Nacos原理及调优】「原理分析专题」配置中心加载原理和配置实时更新原理分析

官方资源 官方资源 带着问题去思考 客户端长轮询的响应时间会受什么影响为什么更改了配置信息后客户端会立即得到响应客户端的超时时间为什么要设置为30s带着以上这些问题我们从服务端的代码中去探寻结论。 配置中心 (Configuration Center) 系统开发过程中通常会将一些需…

用Python调用OpenAI API做有趣的事

获取 API KEY 首先需要 可以开全局的梯子&#xff0c;选择日本或韩国节点&#xff0c;可以通过 ipinfo 检查当前 IP 地址是否为日本或韩国地区&#xff0c;然后访问 OpenAI 网站注册账号并完成认证。 如果自己完成账号认证的成本太高&#xff0c;可以在某宝直接购买一个已经通…

存储也能“一键美颜”?看 XOCP 如何助力互联科技图片业务转型

近日&#xff0c;XSKY星辰天合联合“互联科技”推出了“图片云在线处理”解决方案&#xff0c;提供海量图片高效存储访问和在线图片处理服务&#xff0c;深入业务场景简化操作流程&#xff0c;提升照片流转速度&#xff0c;为客户打造高效敏捷的拍照体验。互联科技&#xff08;…

DAS Over FC 技术允许 ATTO 分解存储并完成 vSAN 认证套件

一、介绍 最近&#xff0c;ATTO Technology, Inc. 以前所未有的方式 完成了 VMware vSAN ReadyNode 认证套件。 测试台本身是公式化的&#xff0c;以三台 Dell R640 服务器作为主机。 除了用于引导的 SD 卡和用于日志记录的单个 SAS SSD 之外&#xff0c;不存在任何内部存储…

EXCEL基础:IFNA、VLOOKUP、SUMIFS函数的使用

注意&#xff1a;本操作数据来源于excel home&#xff0c;特此声明。 查看原始数据&#xff0c;如下所示为【商品】的相关信息&#xff1a; 查看原始数据&#xff0c;如下所示为【供应商】的相关信息&#xff1a; 主要目的&#xff1a;把以上相关信息搞在一张表上。 把下表…

基于jsp+mysql+ssm台球俱乐部管理系统-计算机毕业设计

项目介绍 台球俱乐部系统设计主要是管理员登录后对整个系统相关操作进行处理&#xff0c;可进行管理员的添加和删除&#xff0c;会员信息管理、付费信息管理、球桌信息管理、订桌信息管理等操作管理。采用目前最流行的ssm框架和eclipse编辑器、mysql数据库设计并实现的 本系统…

[附源码]计算机毕业设计冬奥会网上商城Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

什么是BPM系统?BPM流程管理系统介绍

一、什么是BPM系统&#xff1f; BPM系统&#xff08;英文全称&#xff1a;Business Process Management&#xff0c;翻译后简称BPM&#xff09;即业务流程管理系统&#xff0c;是指对端到端业务流程进行建模、分析和优化&#xff0c;以实现战略业务目标&#xff0c;其特点是注…

Elasticsearch:如何在 CentOS 上创建多节点的 Elasticsearch 集群 - 8.x

在我之前的文章 “Elasticsearch&#xff1a;使用 RPM 安装包来安装 Elastic Stack 8.x” 里&#xff0c;我详细地介绍了如何使用 RPM 安装包来安装 Elastic Stack 8.x。在今天的文章中&#xff0c;我来详细描述如何从零开始来创建一个含有三个节点的 Elasticsearch 集群。我们…