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

一、递归遍历代码

// 先序遍历
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,一经查实,立即删除!

相关文章

2312,生成编译命令

compile_commands.json包含各个目录的编译命令,它的生成: cmake: -DCMAKE_EXPORT_COMPILE_COMMANDSON;gn: gn gen . --export-compile-commandsninja ninja -t compdb cxx cc>compile_commands.json生成sphinx文档. 进入doc目录. 然后输入make html,然后等待即可!

Linux---文本搜索命令

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

什么是PHP中的变量作用域?

PHP中的变量作用域(variable scope)指的是变量在代码中可访问的区域或范围。PHP支持多种变量作用域,包括以下几种主要类型: 全局作用域(Global Scope): 在全局作用域中声明的变量可以在脚本的任…

单片机上位机(串口通讯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灰狼算法优化卷积门控循环…

你如何看待“前端已死”

随着人工智能和低代码的崛起,“前端已死”的声音逐渐兴起。前端已死?尊嘟假嘟?快来发表你的看法吧! 一、你如何看待“前端已死” 对于Java是否已经死亡以及前端是否已经凉凉,我认为这样的说法是不准确的。 首先&#…

【Unity】2D项目中如何让Camera展示的大小正好等于某一个Game Object的大小

【背景】 用Unity做工具软件的话希望Camera大小正好和界面Panel一致。 【方法一:手动调整】 相机设置成正交后手动调整边框,当然这种方法精确度不高。 【方法二:在Camera上追加如下脚本】 这里面的public变量里面拖放你想要对齐的目标对象即可。 using UnityEngine;pu…

大数据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命令,将会列出所有可…

Flink系列之:WITH clause

Flink系列之&#xff1a;WITH clause 适用流、批提供了一种编写辅助语句以在较大查询中使用的方法。这些语句通常称为公共表表达式 (CTE)&#xff0c;可以被视为定义仅针对一个查询而存在的临时视图。 WITH 语句的语法为&#xff1a; WITH <with_item_definition> [ , …

C++中的类型转换概念详解和示例代码

1.static_cast static_cast<type>(expression) 是通用的转换形式。可以用于如 int 到 float 的转换&#xff0c;void* 到其它类型指针的转换。也可用于指向基类和派生类的指针之间的转换。 int i 10; float f static_cast<float>(i); // int 转换为 floatvoid*…

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

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

【Spring】Spring中的事务

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

关于 scrapy 中 COOKIES_ENABLED 设置

在 Scrapy 框架中&#xff0c;COOKIES_ENABLED True 时&#xff0c;除了可以在 Request 对象中手动设置 cookies 以外&#xff0c;还可以通过修改 DEFAULT_REQUEST_HEADERS 来全局地为每个请求设置 cookies。以下是一个包含这一信息的博客笔记&#xff1a; Scrapy 爬虫中 Cook…

数值的量级

In wordsPrefix (Symbol)DecimalPower of tenOrder of magnitudenonillionthquecto- (q)0.00000000000000000000000000000110−30−30octillionthronto- (r)0.00000000000000000000000000110−27−27septillionthyocto- (y)0.00000000000000000000000110−24−24sextillionthze…

【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…

暂退法(丢弃法)

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

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

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

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

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

什么是PHP中的PDO事务处理?

在PHP中&#xff0c;PDO&#xff08;PHP Data Objects&#xff09;事务处理是一种数据库操作技术&#xff0c;用于管理数据库连接的事务。事务是一组数据库操作&#xff0c;要么全部成功执行&#xff0c;要么全部失败&#xff0c;保持数据库的一致性和完整性。PDO提供了一种方式…