二叉树的中序遍历(java)

news2024/9/30 6:58:36

概述

关于二叉树,我们都不陌生,许多基于递归的问题发起点都是一个二叉树的root节点。对于各种二叉树的问题,我们也是通过dfs进行求解。例如求二叉树的深度、最近公共祖先等
在这里插入图片描述

算法分析

关于二叉树的中序遍历,我们都知道应该先访问最左边的节点,然后找到root根节点,再访问右节点。对应上图的二叉树,其中序遍历的结果应为:1 -> 2 -> 3 -> 4

算法编码

递归版本

  • 递归的中序遍历写法较为简便,只需要通过inOrder方法写在打印根节点前后的位置即可
public void inOrder(TreeNode root) {
	if(root == null) {
		return;
	}
	inOrder(root.left);
	System.out.print(root.value);
	inOrder(root.right);
}

非递归版本

  • 中序遍历二叉树我们需要优先遍历左子树,然后才是根节点。但是根节点是优先于左子树被访问到的。这种反转的先后关系(先遍历、后打印),就需要借助栈(Stack)完成

如何给出遍历的条件终止和循环也是需要考虑的,我们知道,只要根节点的左子树持续存在,我们就应该先打印左子树的节点,因此这里的逻辑就变成下述代码:

while(cur != null ) {
	stack.push(cur);
	cur = cur.left;
}
  • 如果是上面这种写法,当不存在左节点的时候,循环会跳出while部分,但是我们再取栈顶继续向后遍历的时候,依然要继续while的过程,因此我们的while条件就不能只是 cur的左子树不空,还应该加上当前栈内元素个数大于0
  • 因此上面的代码可以改为:
while(cur != null || !stack.isEmpty()) {
	while(cur != null ) {
		stack.push(cur);
		cur = cur.left;
	}
}
  • 如果cur没有左子树的情况下,我们正常执行出栈,即 stack.pop(),并打印出栈的元素。改造后的代码如下所示
while(cur != null || !stack.isEmpty()) {
	while(cur != null ) {
		stack.push(cur);
		cur = cur.left;
	}
	TreeNode top = st.pop();
	System.out.println(top.val);
}
  • 如果有右子树的情况下,cur转换为右子树,继续上述过程
while(cur != null || !stack.isEmpty()) {
	if(cur != null ) {
		stack.push(cur);
		cur = cur.left;
	}
	cur = st.pop();
	//中序遍历的顺序结果打印
	System.out.println(cur.val);
	cur = cur.right;	
}

算法总结

中序遍历在求解二叉树top-K问题的时候比较实用,可以直接通过打印、取值的情况下完成结果集的获取;如果求第k大或者第k小的元素,直接通过统计变量进行递减实现结果获取。希望大家都能清晰地掌握。

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

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

相关文章

无人机之集群路径规划篇

无人机的集群路径规划是一个复杂而重要的任务,它要求为一群无人机设计出既安全又高效的飞行路径,同时考虑到多种约束条件和目标。 一、路径规划的重要性 无人机集群路径规划对于确保无人机能够安全、高效地完成任务至关重要。通过合理的路径规划&#x…

Word办公自动化的一些方法

1.Word部分内容介绍 word本身是带有格式的一种文档,有人说它本质是XML,所以一定要充分利用标记了【样式】的特性来迅速调整【格式】,从而专心编辑文档内容本身。 样式(集) 编号(多级关联样式编号&#xff…

企业如何提升知识产权管理效率?

随着企业规模的扩大和创新活动的增加,知识产权管理日益复杂。有效的知识产权管理不仅能够保护企业的创新成果,还能为企业带来巨大的商业价值。然而,许多企业在知识产权管理方面面临着效率低下的问题,管理效率的提升成为企业亟需解…

XSS | 存储型 XSS 攻击

关注这个漏洞的其他相关笔记:XSS 漏洞 - 学习手册-CSDN博客 0x01:存储型 XSS —— 理论篇 存储型 XSS 又称持久型 XSS,攻击脚本将被永久的存放在目标服务器的数据库或文件中,具有很高的隐蔽性。 常见的攻击方式: 这种…

升级 Windows 后如何恢复丢失的文件

升级到 Windows 11 后可以恢复丢失的文件!阅读帖子直到最后,了解如何做到这一点。 为了获得安全更新并使用最新的操作系统,人们会升级到最新版本的 Windows。然而,在这样做的过程中,许多人丢失了他们的重要文件&#…

Dynamics 365 dependency EntityType

导解决方案时经常会碰到组件依赖导致导入报错,而错误提示中组件只有type, 比如下图中的type 20和60, 初看之下并不知道是什么意思,从parentDisplayName能看出来,这个parent是个实体,但实体中的什么呢,目测是看不出来的…

8621 二分查找

**思路:** 1. 读取输入的元素个数 n。 2. 读取有序数组 ST。 3. 读取要查找的关键字 key。 4. 使用折半查找法(即二分查找)在数组 ST 中查找 key 的位置。 5. 如果找到 key,输出其位置;如果未找到,输出 &qu…

HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新

关键词:h5离线包加载、h5离线包更新、沙箱 在上一篇文章中,我们已经介绍了如何将 rawfile 资源文件中的文件数据拷贝到沙箱下,那么该篇文章将介绍如何加载该沙箱目录下的文件资源(此处以打包后的web资源为例)&#xf…

5.模拟电子技术笔记——放大电路的分析方法

写在前面 这个是模电的第五次笔记,祝大家学习愉快! 笔记部分 1.图解法 我们这节的所有电路都默认是共射放大电路,后面如果没有特殊说明都是共射极的。 1.1 静态工作点的图解分析 我们接下来画出这个电路的直流回路 我们先考察它的输入回…

【redis-04】Redisson实现分布式锁实战和源码剖析

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

ubuntu切换源方式记录(清华源、中科大源、阿里源)

文章目录 前言一、中科大源二、清华源三、阿里源 前言 记录ubunut切换各个源的方式。 备注:更换源之后使用sudo apt-get update更新索引。 提示:以下是本篇文章正文内容,下面案例可供参考 一、中科大源 地址:https://mirrors.u…

【Golang】Go语言字符串处理库--strings

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

RK3588主板PCB设计学习(一)

DCDC电路可以直接参考数据手册: 电源输出3A,回流GND也应该是3A,回流路径和输出路径的电流是一致的,不要输出路径布线很粗,GND回流路径很细,并且应该保证回流面积最小: 这一点讲的很到位&#xf…

《深度学习》OpenCV 指纹验证、识别

目录 一、指纹验证 1、什么是指纹验证 2、步骤 1)图像采集 2)图像预处理 3)特征提取 4)特征匹配 5)相似度比较 6)结果输出 二、案例实现 1、完整代码 2、实现结果 调试模式: 三、…

华为云LTS日志上报至观测云最佳实践

华为云LTS简介 华为云云日志服务(Log Tank Service,简称 LTS),用于收集来自主机和云服务的日志数据,通过海量日志数据的分析与处理,可以将云服务和应用程序的可用性和性能最大化,为您提供实时、…

音乐项目总结(终)

总的来说写这个项目还是状态差了,前期中期写太慢,后期疯狂赶。 讲点对写这个项目能想起来解决的问题和写的的感触。 前期:当时觉得时间很充足,有布置算法题,我竟然还花三四天去学算法,,动态规划…

【软设】项目管理

【软设】项目管理 (要会根据Gantt和Pert图求关键路径,可以看3.3的示例来了解Pert图) 一.进度管理 进度管理 是项目管理的重要组成部分,旨在确保项目在规定的时间范围内完成。进度管理不仅包括项目活动的规划,还包括监控和控制项目活动的进…

LeetCode 热题 100 回顾8

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

Mixture-of-Experts (MoE): 条件计算的诞生与崛起【下篇】

将 Mixture-of-Experts 应用于 Transformers 既然我们已经研究了条件计算的早期工作,那么我们就可以看看 MoE 在变换器架构中的一些应用。 如今,基于 MoE 的 LLM 架构(如 Mixtral [13] 或 Grok)已广受欢迎,但 MoE 在语…

【C++题目】7.双指针_和为 s 的两个数字

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: LCR 179.查找总价格为目标值的两个商品 题目描述: 解法 解法一(暴力解法,会超时) 两层 for 循环列出所有两个数字的组合…