非递归方式遍历二叉树的原理

一、递归遍历代码

// 先序遍历
void PreOrder(BiTNode *T){if (T!=NULL){visit(T);  // 最简单的visit就是printf(T->data)PreOrder(T->lChild);PreOrder(T->rChild);}
}// 中序遍历
void InOrder(BiTNode *T){if (T!=NULL){InOrder(T->lchild);visit(T);InOrder(T->rchild);}
}// 后序遍历
void PostOrder(BiTNode *T){if (T!=NULL){PostOrder(T->lchild);PostOrder(T->rchild);visit(T);}
}

二、三种遍历过程示意图以及非递归遍历相关原理

以表达式a*b-c为例构建二叉树,则对该二叉树进行前序遍历就是前缀表达式,中序遍历就是中缀表达式,后序遍历就是后缀表达式。三种遍历过程示意图如下:
请添加图片描述
虚线表示递归执行过程(箭头向下表示前往更深一层的递归调用,箭头向上表示从递归调用推出返回);虚线旁的三角形、圆形、方形内的字符分别表示在先序、中序、后序遍历二叉树过程中访问节点时输出的信息。

从上图可知(也可从去掉visit的代码得知),从递归执行过程的角度来看先序、中序、后序遍历,是完全相同的。仿照递归算法执行过程中递归工作栈的状态变化状况可直接写出相应的非递归算法。

对于中序遍历递归算法,当栈顶记录中的指针非空时,应遍历左子树,即指向左子树根的指针进栈;若栈顶记录中的指针为空,则应退至上一层。若是从左子树返回,则应访问当前层即栈顶记录中指针所指的根节点;若是从右子树返回,则表明当前层的遍历结束,应继续退栈。

从另一角度看,这意味着遍历右子树时不再需要保存当前层的根指针。

以此可以更加深刻理解那句“只有后序遍历可以找到一个节点的祖先”。
因为前序、中序遍历,遍历到右子树节点时,右子树的左兄弟和父节点都遍历完成,且不会在后面的遍历过程中被需要,因此可直接退栈。所以这两种遍历方式并不能找不到一个右子树节点的所有祖先。

而对于后序遍历,根据左右根的顺序,若当前节点是一个左子树的节点,那么:1)其右兄弟还未进栈;2)其父节点进栈了但没有被访问而弹出。因此栈中保存的就是该节点到其祖先节点的路径;
若当前节点是一个右子树的节点,那么:1)其左子树在返回根节点之前就被访问并弹出了;2)其父节点进栈了但没有被访问而弹出。

因此可知后序遍历可以找到一个节点的祖先(栈中有且只有所有祖先所串成的整个路径)

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

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

相关文章

Linux---文本搜索命令

1. grep命令的使用 命令说明grep文本搜索 grep命令效果图: 2. grep命令选项的使用 命令选项说明-i忽略大小写-n显示匹配行号-v显示不包含匹配文本的所有行 -i命令选项效果图: -n命令选项效果图: -v命令选项效果图: 3. grep命令结合正则表达式的使用 正则表达式说明^以指…

单片机上位机(串口通讯C#)

一、简介 用C#编写了几个单片机上位机模板。可定制!!! 二、效果图

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-GRU-selfAttention灰狼算法优化卷积门控循环…

大数据HCIE成神之路之数据预处理(2)——异常值处理

异常值处理 1 异常值处理1.1 散点图1.1.1 实验任务1.1.1.1 实验背景1.1.1.2 实验目标1.1.1.3 实验数据解析 1.1.2 实验思路1.1.3 实验操作步骤1.1.4 结果验证 1.2 基于分类模型的异常检测1.2.1 实验任务1.2.1.1 实验背景1.2.1.2 实验目标1.2.1.3 实验数据解析 1.2.2 实验思路1.…

深入了解Linux网络配置:常见面试问题及解答

学习目标: 解释Linux网络配置的重要性和作用引入常见的面试问题 学习内容: 如何查看当前系统的IP地址和网关信息? 解答:可以使用ifconfig命令来查看当前系统的IP地址和网关信息。通过运行ifconfig命令,将会列出所有可…

数字基础设施及相关产业链报告:数据要素加快推进、AI终端应用加速发展

今天分享的AI系列深度研究报告:《数字基础设施及相关产业链报告:数据要素加快推进、AI终端应用加速发展》。 (报告出品方:长城证券) 报告共计:16页 1. 行业观点 在 TMT 各子板块:电子、通信、…

【Spring】Spring中的事务

文章目录 1. Spring事务简介2. Spring事务的案例案例代码代码目录结构数据库pom.xmlResource/jdbc.propertiesconfig/SpringConfig.javaconfig/JdbcConfig.javaconfig/MyBatisConfig.javadao/AccountDao.javaservice/AccountService.javaservice/impl/AccountServiceImpl.java测…

【Mode Management】ComM详细介绍

目录 1. Introduction and functional overview 2.Dependencies to other modules 3.Functional specification 3.1 Partial Network Cluster Management 3.2 ComM channel state machine 3.2.1 Behaviour in state COMM_NO_COMMUNICATION 3.2.1.1 COMM_NO_COM_NO_PENDI…

暂退法(丢弃法)

在深度学习中,丢弃法(Dropout)是一种常用的正则化技术,旨在减少模型的过拟合现象,可能会比之前的权重衰减(Weight Decay)效果更好。通过在训练过程中随机丢弃一部分神经元,可以有效地减少神经网络中的参数依…

Python实验项目9 :网络爬虫与自动化

实验 1:爬取网页中的数据。 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 # 要求:使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 import urllib.r…

微服务最佳实践:构建可扩展且高效的系统

微服务架构彻底改变了现代软件开发,提供了无与伦比的敏捷性、可扩展性和可维护性。然而,有效实施微服务需要深入了解最佳实践,以充分发挥微服务的潜力,同时避免常见的陷阱。在这份综合指南中,我们将深入研究微服务的关…

跟iPhone类似,不同品牌的手机、电脑随时使用“隔空投送”功能!如何开启?

iPhone的隔空投送是一个很受欢迎的功能。打开一个 App,然后轻点“共享”或“共享”按钮,再点击隔空投送,就可以分享图片、视频、文件出去。 然而,如果你用的不是苹果的产品,iPhone的隔空投送功能就有了“隔阂”。 不过…

CountDownLatch实战应用——实现异步多线程业务处理,异常情况回滚全部子线程

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: CountDownLatch实战应用——实现异步多线程业务处理,异常情…

H266/VVC编码标准介绍

视频编码标准 多样的视频应用催生了多种的视频编码方法。为了使编码后的码流能够在大范围内通用和规范,从20世纪80年代开始,国际组织就开始对视频编码建立国际标准。 什么是视频编码标准: 视频编码标准只规定了码流的语法语义和解码器&#…

Appium —— 初识移动APP自动化测试框架Appium

说到移动APP自动化测试,代表性的测试框架非Appium莫属,从今天开始我们将从APP结构解析、Appium框架学习、安卓/iOS自动化测试实战、自动遍历回归测试、自动化测试平台及持续集成,多个维度一起由浅入深的学废Appium 今天我们先来初步认识Appi…

【消息中间件】Rabbitmq的基本要素、生产和消费、发布和订阅

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、消息队列的基本要素1.队列:queue2.交换机:exchange3.事件:routing_key4.任务:task 二、生产消费模式1.安装pika2.模拟生产者进程3.模…

【HR培训】行为反馈复盘,走出舒适区--20231217

行为反馈复盘,走出舒适区–鱼缸会议 要点:在于建立平等、透明、敢说的反馈环境,不打断、不争论 鱼缸会议流程 导入——入缸——反馈——承诺——关闭 步骤1:导入 目的:平等、透明、敢说的反馈 人员:主…

maui中实现加载更多 RefreshView跟ListView(1)

效果如图: MainPage.xaml.cs: using System; using System.Collections.ObjectModel; using System.Threading.Tasks; using Microsoft.Maui.Controls; using Microsoft.Maui.Controls.Xaml; using System.ComponentModel; using System.Runtime.CompilerServices…

计算机网络基础——网线认识与制作,线缆类型、线序、端接标准及注意事项

一、引言 网线制作是网络基础知识中不可或缺的。网络传输过程中,网线的质量和制作方法都会直接影响传输的速度和稳定性。本文将详细介绍网线制作的基础知识、线缆类型、线序、端接标准及注意事项。希望通过本文,读者能够更好地了解和掌握网线制作的方法…

AMD 自适应和嵌入式产品技术日

概要 时间:2023年11月28日 地点:北京朝阳新云南皇冠假日酒店 主题内容:AMD自适应和嵌入式产品的更新,跨越 云、边、端的AI解决方案,赋能智能制造的机器视觉与机器人等热门话题。 注:本文重点关注FPGA&a…