代码随想录day13 Java版 二叉树部分-遍历全解

1.二叉树的递归遍历

回顾了递归的套路:1.返回值+传入参数

                                   2.结束条件

                                   3.写具体的每一个递归单位

而在二叉树的三种遍历都没有返回值,传入当前node节点和所给框架下的返回值数组res

当传入的节点是null时结束递归

每个递归单位包含输出当前节点+递归左孩子+递归右孩子,改变输出的位置即可实现三种遍历

144.二叉树的前序遍历

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();pre(root,res);return res;}void pre(TreeNode node, List<Integer> res){if(node == null) return;res.add(node.val);pre(node.left,res);pre(node.right,res);}
}

145.二叉树的后序遍历

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();post(root,res);return res;}void post(TreeNode node, List<Integer> res){if(node == null) return;post(node.left,res);post(node.right,res);res.add(node.val);}
}

94.二叉树的中序遍历

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();in(root,res);return res;}void in(TreeNode node, List<Integer> res){if(node == null) return;in(node.left,res);res.add(node.val);in(node.right,res);}
}

2.二叉树的迭代遍历

144.二叉树的前序遍历

众所周知递归都可以改成循环,本质上还是自己模拟递归栈的过程

前序遍历模拟最简单,因为处理的节点和先访问的节点一致,可以直接将节点的左右孩子入栈

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) return res;Deque<TreeNode> s = new LinkedList<>();s.push(root);while (!s.isEmpty()) {TreeNode cur = s.pop();res.add(cur.val);if (cur.right != null) s.push(cur.right);if (cur.left != null)  s.push(cur.left);}return res;}
}
  • 145.二叉树的后序遍历(opens new window)

稍微改动下前序遍历的代码,左右孩子改下顺序再将最后的结果逆序就可以得到后序遍历的结果

Java里的集合进行逆序:Collections.reverse(res)

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) return res;Deque<TreeNode> s = new LinkedList<>();s.push(root);while (!s.isEmpty()) {TreeNode cur = s.pop();res.add(cur.val);if (cur.left != null)  s.push(cur.left);if (cur.right != null) s.push(cur.right);}Collections.reverse(res);return res;}
}

94.二叉树的中序遍历

中序遍历没办法像前序遍历直接模拟,需要一路向左入栈,左孩子为空后处理,再查看右孩子

代码上while内的条件直接作为两个分支处理

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new LinkedList<>();if (root == null) return res;Deque<TreeNode> s = new LinkedList<>();TreeNode cur = root;while(cur != null || !s.isEmpty()){if (cur != null) {s.push(cur);cur = cur.left;}else {cur = s.pop();res.add(cur.val);cur = cur.right;}}return res;}
}

3.二叉树的层序遍历

按照广度优先搜索,从根节点(第一层)开始,输出节点后将节点的左右孩子入队

注意代码中队列使用offer和poll,以及容器的size要在循环前保存

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();if (root == null) return res;Deque<TreeNode> q =new LinkedList<>();q.offer(root);while(!q.isEmpty()){List<Integer> list=new ArrayList<>();int n = q.size();for (int i = 0; i < n; i++) {TreeNode node = q.poll();list.add(node.val);if (node.left != null)  q.offer(node.left);if (node.right != null) q.offer(node.right);}res.add(list);}return res;}
}

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

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

相关文章

centos7安装mysql5.7 或者mysql8

1、centos7安装mysql8 mysql官网 https://dev.mysql.com/downloads/mysql/ 示例2个版本的下载地址 #5.7.30下载地址 wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar #8.0.22下载地址 wget https://cdn.mysql.com/archives/mysql-8…

Maya------布尔 圆形圆角组件

17. maya常用命令7.布尔 圆形圆角组件_哔哩哔哩_bilibili 选中一个模型&#xff0c;再按shift加选另外一个模型 圆形圆角命令

OpenStack平台镜像优化

OpenStack平台镜像优化 OpenStack平台镜像优化 案例准备 1. 规划节点 根据云平台分配的主机。节点规划见表1。 表1 节点规划 IP主机名节点192.168.200.11controller控制节点 2. 基础准备 使用云平台分配的All in one作为实验节点&#xff0c;本案例只讲述如何优化通过打…

PVE安装后报错:NO IOMMU Detected解决办法

&#xff11;、首先在BIOS中确定图形界面卡&#xff0c;打开了VT-D功能。 &#xff12;、修改grub vim /etc/default/grub 找到&#xff1a;GRUB_CMDLINE_LINUX_DEFAULT"quiet" 然后修改为 GRUB_CMDLINE_LINUX_DEFAULT"quiet intel_iommuon" 3、使用命…

华擎B660 主板 怎么设置打开来电自启功能?

环境&#xff1a; 华擎B660 钢铁传奇 1700 : Intel B660 问题描述&#xff1a; 华擎B660 主板 怎么设置打开来电自启功能&#xff1f; 解决方案&#xff1a; 1.前往-高级- 芯片组配置 2.往下划找到交流 /电源断电恢复 选择电源故障后的电源状态。如果选择 [关机]&#x…

使用MySQL存储过程构建动态SQL查询

一、引言 在开发过程中&#xff0c;根据传递不同的参数查询不同的数据是很常用的需求&#xff0c;一般是在服务端代码实现&#xff0c;但是有时候需要直接对接数据库的时候&#xff0c;没法对参数进行判断和修改对应的SQL&#xff0c;因此需要用到数据库的存储过程&#xff0c;…

mapbox gl 测量

一、代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Measure distances</title> <meta name"viewport" content"initial-scale1,maximum-scale1,user-scalableno"> <link hre…

Typora导出html文件图片自动转换成base64

Typora导出html文件图片自动转换成base64 一、出现问题二、解决方案三、编码实现3.1.创建Java项目3.2.代码3.3.打包成Jar包 四、如何使用endl 一、出现问题 typora 导出 html 的时候必须带有原图片&#xff0c;不方便交流学习&#xff0c;文件太多显得冗余&#xff0c;只有将图…

【vim 学习系列文章 3.2 -- vim 删除 空格】

文章目录 vim 删除行尾空格 vim 删除行尾空格 在代码开发的过程中&#xff0c;经常会遇到行尾有空格的现象&#xff0c;如下&#xff1a; 我们可以在 .vimrc 中通过map 命令来映射删除行尾空格的快捷键&#xff0c;如下&#xff1a; map d<space> :%s/\s*$//g <cr…

Spring速成(一)

文章目录 Spring速成&#xff08;一&#xff09;1&#xff0c;课程介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概…

Linux实验记录:使用Apache的虚拟主机功能

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 正文&#xff1a; 目录 前言&#xff1a; 正文&…

【重温设计模式】构建器及其Java示例

设计模式中的构建器模式介绍 在编程的世界里&#xff0c;设计模式是一种让我们的代码更加优雅、可读、可维护的工具。其中&#xff0c;构建器模式是一种创建型模式&#xff0c;它提供了一种高效且灵活的方式来创建复杂对象。这种模式的主要特点是&#xff0c;它分离了对象的构…

易点易动设备管理平台助力制造企业实现设备的智能化维修和保养管理

在制造业领域&#xff0c;设备的维修和保养是保障生产运行和产品质量的关键环节。然而&#xff0c;传统的维修和保养管理方式往往存在效率低下、难以及时发现问题等问题。为了解决这些挑战&#xff0c;易点易动设备管理平台应运而生。该平台利用物联网和数据分析技术&#xff0…

回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测

回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测 目录 回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-GRU【24年新算法】冠豪猪优化…

sectigo ip ssl证书有哪些

Sectigo是移交成立时间较久的CA认证机构&#xff0c;几十年来在全球颁发了各种各样的数字证书&#xff0c;例如&#xff0c;单域名SSL证书、多域名SSL证书、通配符SSL证书等域名SSL证书。Sectigo旗下也有一些不常见的数字证书&#xff0c;例如&#xff0c;代码签名证书、IP证书…

【设计模式】六大原则详解,每个原则提供代码示例

设计模式六大原则 目录 一、单一职责原则——SRP 1、作用2、基本要点3、举例 二、开放封闭原则——OCP 1、作用2、基本要点3、举例 三、里氏替换原则——LSP 1、作用2、基本要点3、举例 四、依赖倒置原则——DLP 1、作用2、基本要点3、举例 五、迪米特法则——LoD 1、作用2、…

@PostConstruct注解介绍

PostConstruct注解 PostConstruct是Java EE 5引入的一个注解&#xff0c;它用于指定在对象初始化完成之后需要执行的方法。在Spring框架中&#xff0c;PostConstruct注解通常与Service、Component等注解一起使用&#xff0c;用来执行一些在对象创建后需要进行的初始化工作。 作…

C++数据结构——红黑树

一&#xff0c;关于红黑树 红黑树也是一种平衡二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;颜色右两种&#xff0c;红与黑&#xff0c;因此也称为红黑树。 通过对任意一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树可以…

Android Build 依赖项

在项目中的Build.Gradle文件中dependencies代码块中添加指定依赖项。 有三种不同类型的依赖项 本地模块依赖项 implementation project(:mylibrary)这个mylibrary 必须在 settings.gradle 中使用的库名称相同 本地文件依赖项 implementation fileTree(dir: libs, include:…

(2)SpringBoot学习——芋道源码

Spring Boot 的自动配置 1.概述 EmbeddedWebServerFactoryCustomizerAutoConfiguration 类 Configuration // <1.1> ConditionalOnWebApplication // <2.1> EnableConfigurationProperties(ServerProperties.class) // <3.1> public class EmbeddedWebSe…