当前位置: 首页 > news >正文

二叉树的遍历方式

文章目录

  • 层序遍历——队列实现
    • 分析
    • Java完整代码
  • 先序遍历——中左右
    • 分析
    • 递归实现
    • 非递归实现——栈实现
  • 中序遍历——左中右
    • 递归实现
    • 非递归实现——栈实现
  • 后续遍历——左右中
    • 递归实现
    • 非递归实现——栈加标志指针实现
  • 总结

层序遍历——队列实现

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)

分析

借助队列存储的方式实现。队列这个数据结构是先入先出的。

具体步骤:
1、将根节点入队
2、出队首节点,将队首节点的左右非空孩子入队
3、重复2操作直到队列为空

注意:Java的队列由linkedList实现的,这个需要注意一下。

Java完整代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<>();  if (root == null) {return res;}LinkedList<TreeNode> queue = new LinkedList<>(); // Java的队列由linkedList实现的queue.add(root);while (!queue.isEmpty()) {List<Integer> list = new ArrayList<>();int current_queue_size = queue.size();for (int i = 0; i < current_queue_size; i++) {TreeNode top = queue.getFirst();list.add(top.val);if (top.left != null) {queue.add(top.left);}if (top.right != null) {queue.add(top.right);}queue.removeFirst();}res.add(list);}return  res;}}

先序遍历——中左右

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

分析

前序遍历是先访问根节点再左孩子然后右孩子。

递归实现

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

非递归实现——栈实现

借助栈数据结构

 * Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null) {return result;}Stack<TreeNode> stack = new Stack<>();TreeNode p = root;TreeNode tmp;while (p != null || !stack.isEmpty()) {// 一路向左if (p != null) {result.add(p.val);stack.push(p);p = p.left;} else {tmp = stack.pop();p = tmp.right;}}return result;}
}

中序遍历——左中右

递归实现

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

非递归实现——栈实现

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null) {return result;}Stack<TreeNode> stack = new Stack<>();TreeNode p = root;TreeNode tmp;while (p != null || !stack.isEmpty()) {// 一路向左if (p != null) {stack.push(p);p = p.left;} else {tmp = stack.pop();result.add(tmp.val);p = tmp.right;}}return result;}
}

后续遍历——左右中

递归实现

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

非递归实现——栈加标志指针实现

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null) {return result;}Stack<TreeNode> stack = new Stack<>();TreeNode p = root;TreeNode tmp;TreeNode review = null;while (p != null || !stack.isEmpty()) {// 一路向左if (p != null) {stack.push(p);p = p.left;} else {tmp = stack.peek();if (tmp.right == null || review == tmp.right) {result.add(tmp.val);review = stack.pop();} else {p = tmp.right;}}}return result;}
}

总结

对于树的问题,更多能通过递归去简化问题,更好解决实际问题。

ps:计划每日更新一篇博客,今日2023-04-29,日更第十三天。
昨日更新:
反转字符串

相关文章:

二叉树的遍历方式

文章目录 层序遍历——队列实现分析Java完整代码 先序遍历——中左右分析递归实现非递归实现——栈实现 中序遍历——左中右递归实现非递归实现——栈实现 后续遍历——左右中递归实现非递归实现——栈加标志指针实现 总结 层序遍历——队列实现 给你二叉树的根节点 root &…...

SpringCloud01

SpringCloud01 微服务入门案例 实现步骤 导入数据 实现远程调用 MapperScan("cn.itcast.order.mapper") SpringBootApplication public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}…...

SpringBoot整合Redis实现点赞、收藏功能

前言 点赞、收藏功能作为常见的社交功能&#xff0c;是众多Web应用中必不可少的功能之一。而redis作为一个基于内存的高性能key-value存储数据库&#xff0c;可以用来实现这些功能。 本文将介绍如何使用spring boot整合redis实现点赞、收藏功能&#xff0c;并提供前后端页面的…...

【Java入门合集】第一章Java概述

【Java入门合集】第一章Java概述 博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.理解JVM、JRE、JDK的概念&#xff1b; 2.掌握Java开发环境的搭建,环境变量的配置&#xff1b; 3.掌握Java程序的编写、编译和运行&#xff1b; 4.学会编写第一个Java程序&#x…...

Android无线调试操作说明

1.首先通过手机机蓝牙将jackpal.androidterm-1.0.70.apk(终端模拟器)传的设备上安装 链接: https://pan.baidu.com/s/151SzEgsX0b_VTWowzfUrsA?pwdrn75 提取码: rn75 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 2.打开这个终端模拟器&#xff0c;输入以下命…...

什么是 Python ?聊一聊Python程序员找工作的六大技巧

最近我一直在思考换工作的事情。因此&#xff0c;这段时间我会看一些题目&#xff0c;看一些与面试相关的内容&#xff0c;以便更好地准备面试。我认为无论你处于什么阶段&#xff0c;面试中都会有技术面试环节。无论是初级职位还是高级职位&#xff0c;都需要通过技术面试来检…...

RabbitMQ 01 概述

什么是消息队列 进行大量的远程调用时&#xff0c;传统的Http方式容易造成阻塞&#xff0c;所以引入了消息队列的概念&#xff0c;即让消息排队&#xff0c;按照队列进行消费。 它能够将发送方发送的信息放入队列中&#xff0c;当新的消息入队时&#xff0c;会通知接收方进行处…...

面经|曹操出行供需策略运营

1.自我介绍 面试官表示看了简历之后&#xff0c;表示对专业能力比较放心。想了解下对于专业能力之外&#xff0c;关于其他方面的介绍。 2.策略运营&#xff0c;除了工具之外&#xff0c;还有哪些能力是需要具备的 回答&#xff1a;主要是从做项目的维度逻辑先去回答的。 分析思…...

【Python】selenium工具

目录 1. 安装 2. 测试 3. 无头浏览器 4. 元素定位 5. 页面滑动 6. 按键、填写登录表单 7. 页面切换 Selenium是Web的自动化测试工具&#xff0c;为网站自动化测试而开发&#xff0c;Selenium可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff0c;可以接…...

实验六~Web事件处理与过滤器

1. 创建一个名为exp06的Web项目&#xff0c;编写、部署、测试一个ServletContext事件监听器。 BookBean代码 package org.example.beans;import java.io.Serializable;/*** Created with IntelliJ IDEA.* Description:* User: Li_yizYa* Date: 2023—04—29* Time: 18:39*/ Su…...

刷题4.28

1、 开闭原则软件实体&#xff08;模块&#xff0c;类&#xff0c;方法等&#xff09;应该对扩展开放&#xff0c;对修改关闭&#xff0c;即在设计一个软件系统模块&#xff08;类&#xff0c;方法&#xff09;的时候&#xff0c;应该可以在不修改原有的模块&#xff08;修改关…...

做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !

前段時间&#xff0c;在网上看到一句话&#xff1a;有什么事情&#xff0c;比窮更可怕&#xff1f; 有人回答说&#xff1a;“又忙又窮。” 很扎心&#xff0c;却是绝大多数人的真实写照。 每天拼死拼活的996&#xff0c;你有算过你的時间值多少钱&#xff1f; 我们来算一笔…...

线性回归模型(7大模型)

线性回归模型&#xff08;7大模型&#xff09; 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中&#xff0c;线性回归都是非常有用的&#xff0c;例如金融、医疗、社交网络、推荐系统等等。 在机器学习中&#xff0c;线性回归是最基本的模型之一&am…...

VP记录:Codeforces Round 868 (Div. 2) A~D

传送门:CF A题:A-characteristic 构造一个只有 1 , − 1 1,-1 1,−1的数组,满足乘积为 1 1 1的数对的个数为 k k k. 发现 n n n的范围很小,考虑直接暴力枚举数组中 1 1 1的个数,记为 i i i,那么对于1的所有数对来说,我们有 i ∗ ( i − 1 ) / 2 i*(i-1)/2 i∗(i−1)/2个,然后…...

【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2

【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2 0、前言Abstract1 Introduction2 Background2.1 Vector Quantized Variational AutoEncoder3 Method3.1 Stage 1: Learning Hierarchical Latent Codes3.2 Stage 2: Learning Priors over Latent C…...

并发编程基石:管程

大家好&#xff0c;我是易安&#xff01; 如果有人问我学习并发并发编程&#xff0c;最核心的技术点是什么&#xff0c;我一定会告诉他&#xff0c;管程技术。Java语言在1.5之前&#xff0c;提供的唯一的并发原语就是管程&#xff0c;而且1.5之后提供的SDK并发包&#xff0c;也…...

电路中噪声来源

电路包括不同的部件和芯片&#xff0c;所有都有可能成为噪声的来源。例如&#xff0c;电阻会带来热噪声&#xff0c;这个噪声为宽频噪声&#xff0c;几乎涵盖所有频率范围&#xff1b;运算放大器其芯片内部会产生噪声&#xff1b;而 ADC产生的量化噪声相较于其他器件&#xff0…...

JAVASE的全面总结

&#xff08;未完待续&#xff09; 五、子类与继承 5.1 子类与父类 继承是一种由已有的类创建新类的机制。利用继承&#xff0c;我们可以先创建一个共有属性的一般类&#xff0c;根据该一般类再创建具有特殊属性的新类&#xff0c;新类继承一般类的状态和行为&#xff0c;并…...

关于repeater录制的流量子调用的identity中带有~S的情况

前段时间同事问我&#xff0c;我们录制的流量中&#xff0c;尤其是dubbo的子调用显示经常他的末尾会带上一个小尾巴这个是什么意思呢&#xff0c;其实之前我没有太在意这个事情&#xff0c;只是同事这么疑问了&#xff0c;确实激起了好奇心&#xff0c;所以就差了下 到底是什么…...

Java面试题队列

Java中的队列都有哪些&#xff0c;有什么区别 1. ArrayDeque, &#xff08;数组双端队列&#xff09; 2. PriorityQueue, &#xff08;优先级队列&#xff09; 3. ConcurrentLinkedQueue, &#xff08;基于链表的并发队列&#xff09; 4. DelayQueue, &#xff08;延期…...

Arduino控制步进电机全攻略:从脉冲计算到加速曲线优化

Arduino控制步进电机全攻略&#xff1a;从脉冲计算到加速曲线优化 引言&#xff1a;为什么需要精准控制步进电机&#xff1f; 在创客和嵌入式开发领域&#xff0c;步进电机因其精准的开环控制特性而广受欢迎。不同于普通直流电机&#xff0c;步进电机能够通过精确控制脉冲数量来…...

零代码玩转视觉定位:基于Qwen2.5-VL的Chord模型,Gradio界面快速上手

零代码玩转视觉定位&#xff1a;基于Qwen2.5-VL的Chord模型&#xff0c;Gradio界面快速上手 1. 视觉定位技术简介 视觉定位&#xff08;Visual Grounding&#xff09;是一项让计算机能够理解自然语言描述并在图像中精确定位目标对象的技术。想象一下&#xff0c;当你对计算机…...

s2-pro多场景落地:法律文书语音宣读+重点条款强调音效添加

s2-pro多场景落地&#xff1a;法律文书语音宣读重点条款强调音效添加 1. 场景需求分析 在法律服务领域&#xff0c;文书宣读是一项高频且重要的需求。传统方式存在几个痛点&#xff1a; 人工宣读成本高&#xff1a;需要专业播音员录制&#xff0c;耗时耗力修改不便&#xff…...

OCaml持续集成终极指南:从GitHub Actions到自动化部署的完整流程 [特殊字符]

OCaml持续集成终极指南&#xff1a;从GitHub Actions到自动化部署的完整流程 &#x1f680; 【免费下载链接】ocaml The core OCaml system: compilers, runtime system, base libraries 项目地址: https://gitcode.com/gh_mirrors/oc/ocaml OCaml作为功能强大的静态类型…...

终极指南:如何在Quarkus中配置和使用JVM系统属性

终极指南&#xff1a;如何在Quarkus中配置和使用JVM系统属性 【免费下载链接】quarkus Quarkus: Supersonic Subatomic Java. 项目地址: https://gitcode.com/GitHub_Trending/qu/quarkus Quarkus作为一款针对Java优化的现代框架&#xff0c;提供了灵活且高效的系统属性…...

Spring AI智能客服多轮问答实战:从架构设计到生产环境部署

最近在做一个智能客服项目&#xff0c;客户反馈最集中的问题就是“机器人聊着聊着就忘了前面说过什么”。比如用户想订机票&#xff0c;先问了“明天北京到上海的航班”&#xff0c;接着问“下午的呢&#xff1f;”&#xff0c;机器人很可能就懵了&#xff0c;因为它丢失了“北…...

浅谈项目运行时,jvm是如何工作的

最近研究了一下项目运行时&#xff0c;jvm是如何工作的&#xff0c;按照自己的理解画的图&#xff0c;一块复习一下有不对的地方&#xff0c;欢迎大家一块讨论...

YOLO X Layout实战:从扫描PDF中自动提取标题与表格的Python实现

办公室最头疼的工作之一就是处理扫描版PDF&#xff1a;不管是合同、审计报告、论文还是发票&#xff0c;扫描版的PDF都是图片&#xff0c;没法复制文本&#xff0c;要提取里面的标题、目录、表格&#xff0c;只能手动敲&#xff0c;几十页的PDF要花几个小时&#xff0c;特别浪费…...

Python实战:5分钟用高德API搞定全国区县边界坐标采集(附完整代码)

Python实战&#xff1a;高德API高效获取全国区县边界坐标的工程化解决方案 1. 需求背景与方案设计 地理信息系统开发中经常需要精确的行政区划边界数据。传统手动采集方式效率低下&#xff0c;而高德地图API提供了完善的行政区划查询接口。本方案将实现&#xff1a; 全国省/…...

SpringBoot集成MinIO实战:从零构建企业级文件存储服务

1. 为什么选择MinIO作为企业级文件存储方案 MinIO这几年在企业级存储领域越来越火&#xff0c;我最早接触它是在2018年做电商项目时遇到的图片存储需求。当时对比了FastDFS、HDFS等方案后&#xff0c;最终选择了MinIO&#xff0c;现在回头看这个决定非常正确。MinIO最吸引人的地…...