二叉树统一迭代法解析

news2024/11/18 13:55:40

引言

 二叉树的遍历无论是通过递归还是迭代都是比较简单的,递归法下不同访问顺序的代码格式较为一致,通过迭代来进行二叉树的前序、中序、后序遍历存在着代码形式不不统一的问题,显得不够优雅。代码随想录里给出了一种适应于这三种顺序遍历的迭代通式,但并没有解释为什么要在其中引入NULL占位,以及其如何发挥作用。本文将针对二叉树统一迭代法给出详细分析。

引入NULL占位原因

简单前序遍历

 首先众所周知,迭代法的最基本思路就是利用栈后进先出的机制来让要遍历的元素始终在栈顶。因此无论是前序遍历还是中序、后续遍历,我们关注的都是节点的入栈顺序。以前序遍历为例,我们会按 中->右->左 的顺序进行入栈操作。而每次出栈时,我们都可以让被遍历完成后的(根)节点立刻弹出,不会留在栈中,栈顶变为下一个子树的根节点。这也是前序遍历简单的原因。以如下的树为例:
在这里插入图片描述
前序遍历时栈的变化为为:

  • 321->32
  • 32->34
  • 34->37
  • 37->3
  • 3->65
  • 65->6

中序遍历的不同

 中序遍历的迭代同样应该遵循一样的入栈思路,入栈顺序为遍历顺序右->中->左。此时,问题就出现了,我们需要先遍历到子节点再回到根节点,而如果代码没有针对性解决的而是对根节点和子节点统一处理,将循环:子节点出栈,操作根节点,子节点入栈,操作子节点这四个步骤。以如下二叉树为例:
在这里插入图片描述

为了实现右中左的入栈顺序,我们每访问到一个根节点,都要执行pop根节点,push右子节点,push根节点,push左子节点的流程。栈的变化为:

  • 654
  • 654->65241
  • 65241->6524
  • 6524->652241

可以看到由于根节点没有弹出,我们从第一个叶子节点返回时会陷入死循环,那么最简单的方案就是告诉算法这里有个访问过q其子树的根节点(通过后缀NULL标识),不让他进入pop根节点,push右子节点,push根节点,push左子节点的流程,直接pop,栈的变化就会变为:

  • 654
  • 654->652 4NULL 1
  • 652 4NULL 1->652 4NULL, OUT1
  • 6524->652,OUT4
  • 652->650 2NULL 9
  • 650 2NULL 9->650 2NULL,OUT9
  • 650 2NULL -> 650,OUT2
  • 650 ->65,OUT0

因此,实际我们要访问根节点的流程变为了pop根节点,push右子节点,push根节点,打上已访问标记后缀NULL, push左子节点。实际编码过程中,我们则是通过判断当前节点是否为NULL来判断其前一个节点是要进入遍历其子树的流程,还是直接输出。
 同理,只要我们是通过调整入栈顺序来实现某种顺序遍历,都可以放置占位符NULL来区分要在该节点遍历子树还是直接输出,具体的代码可以参见:二叉树的统一迭代法

总结

 二叉树的统一迭代法有两个要点:1.确定入栈顺序;2.放置占位符来区分是否要探索当前根节点的子树。

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

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

相关文章

C语言入门教程,C语言学习教程(第三部分:C语言变量和数据类型)一

第三部分:C语言变量和数据类型 本章也是C语言的基础知识,主要讲解变量、数据类型以及运算符,这其中涉及到了数据的存储格式以及不同进制。 一、大话C语言变量和数据类型 在《数据在内存中的存储(二进制形式存储)》一…

LeetCode 36 有效的数独

题目描述 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考…

Spring Cloud + Vue前后端分离-第11章 用户管理与登录

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第11章 用户管理与登录 11-1 增加用户管理功能 用户表设计与基本代码生成 1.用户管理与登录:用户表设计与基本代码生成 all.sql generatorConfig.xml Server…

Unity组件开发--AB包打包工具

1.项目工程路径下创建文件夹:ABundles 2.AB包打包脚本: using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement;public class AssetBundle…

Python从入门到网络爬虫(OS模块详解)

前言 本章介绍python自带模块os,os为操作系统 operating system 的简写,意为python与电脑的交互。os 模块提供了非常丰富的方法用来处理文件和目录。通过使用 os 模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强…

C语言如何提高程序的可读性?

一、问题 可读性是评价程序质量的一个重要标准,直接影响到程序的修改和后期维护,那么如何提高程序的可读性呢? 二、解答 提高程序可读性可以从以下几方面来进行。 (1)C程序整体由函数构成的。 程序中,main()就是其中…

Maven依赖冲突解决

Maven介绍 Maven 是 Apache 软件基金会唯一维护的一款自动化构建工具,专注于服务Java平台的项目构建和依赖管理。 1.Maven是如何寻找依赖的? 首先会去本地仓库寻找,然后会去公司的私服仓库寻找,一般私服仓库存的都是公司自己开发的 jar 包&…

蚁群算法解决旅行商问题的完整Python实现

蚁群算法(Ant Colony Optimization,简称ACO)是一种模拟蚂蚁觅食行为的启发式优化算法。它通过模拟蚂蚁在寻找食物时释放信息素的行为,来解决组合优化问题,特别是旅行商问题(TSP)。 蚁群算法的基…

RAG:让大语言模型拥有特定的专属知识

作为一个在Chatbot领域摸爬滚打了7年的从业者,笔者可以诚实地说,在大语言模型的推动下,检索增强生成(Retrieval Augmented Generation,RAG)技术正在快速崛起。 RAG的搜索请求和生成式AI技术,为搜…

【数据库原理】期末突击(2)

有不会的题可以后台问我的哦,看见了就会回。祝大家期末心想事成。 数据库大题显而易见就只有几类,大家可以根据老师平时讲解的例题对应去解决一类型的题目。 前提知识; 候选码候选键关键字键码 关系代数:(1)传统&…

echarts使用之柱状图

一、引入Echarts npm install eacharts --save 二、选择一个Echarts图 选择创建一个柱状图 option { // x轴参数的基本配置xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun] //X轴数据}, // y轴参数的基本配置yAxis: {type: value}, // series:[{data: …

MySQL连接池、C3P0、Druid德鲁伊连接池技术

MySQL连接池 连接池C3P0Druid 连接池 概念:其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象&#xff0…

怎么样检查自己系统上的Python环境中是否有某个包(扩展库)?

比如我们这里想看下有没有库pytz 很简单,进入Python的命令行,然后输入下面的命令: import pytz如果有这个库,则不会报错,否则会报错。 Windows的测试结果如下: Centos的测试结果如下:

Linux中vim查看文件某内容

一、编辑文件命令 [rootyinheqilin ~]# vim test.txt 1,在编辑的文件中连续按2次键盘的【g】键,光标会移动到文档开头第一行 2,输入一个大写 G,光标会跳转到文件的最后一行第一列(末行) 二、查看文件内容命令 gre…

改善制造业客户体验的实用技巧与策略

制造业是一个关键行业,在经济中发挥着至关重要的作用。它负责为我们的日常生活生产必需品和服务。然而近年来,该行业发生了重大变化,企业现在面临着日益激烈的竞争和满足消费者需求的压力。为了保持竞争力,制造商必须专注于打造更…

算法通关村番外篇-LeetCode编程从0到1系列二

大家好我是苏麟 , 今天来说LeetCode编程从0到1系列二 . 内置函数 最后一个单词的长度 描述 : 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子…

PHP大型企业人才招聘网站源码带文字安装教程

PHP大型企业人才招聘网站源码带文字安装教程 运行环境 服务器宝塔面板 PHP 5.6 Mysql 5.5及以上版本 Linux Centos7以上 功能说明: 会员模块包括企业管理、职位管理、名企管理、企业认证审核、 企业设置。内容模块包括新闻管理、新闻类别、新闻属性、添加新闻。 运营…

海外云手机:一机多用,引领跨境电商新潮流

如今,跨境卖家除了经营跨境平台外,还需抓住短视频和社交媒体的机遇。在社交媒体上实现引流,将流量导向自己的跨境平台或独立站,吸引用户购买,完成流量变现,已成为跨境电商的一项关键策略。本文将介绍如何用…

获取深层次字段报错TypeError: Cannot read properties of undefined (reading ‘title‘)

动态生成菜单时报错,不能多层获取路由meta下面的title字段 <template><p>{{ meneList }}</p><template v-for"item in meneList" :key"item.path"><el-menu-item v-if"!item.children"><template #title>{…

【Tomcat】在一台计算机上运行两个Tomcat服务

首先把Tomcat整个文件复制一份放在其他文件夹路径中 1.修改环境变量 添加环境变量在系统变量里面 “CATALINA_HOME” 指向一个Tomcat文件夹路径 “CATALINA_HOME1” 指另一个Tomcat文件夹路径 2.修改startup里面的环境变量&#xff0c;全部修改 分别修改两个apache-tomcat…