三种方式二叉树求从根到叶子结点的所有路径的方法整理

news2024/11/19 8:46:12

二叉树求从根到叶子结点的所有路径的方法整理

1. 利用递归和回溯方法求解

思路: 利用递归和回溯的方法求解

  • 首先将当前结点加入到path中,然后判断是否为叶子结点,如果为叶子结点,则保存path路径
  • 如果不是叶子结点,则继续递归访问左右子树,访问结束后需要进行回溯。
class solution {
    private ArrayList<ArrayList<Integer>> pathList;
    private LinkedList<Integer> path;

    public void test(TreeNode root) {
        pathList = new ArrayList<>();
        path = new LinkedList<>();
        recurision(root);
    }

    public void recurision(TreeNode node) {
      // 将node加入到path中
        path.add(node.val);
        // 判断当前结点是否为叶子结点
        if (node.left == null && node.right == null) {
          // 为叶子结点,则将path中保存的路径,保存到pathList中
            pathList.add(new ArrayList<>(path));
            return;
        }
        // 如果不是叶子结点,那么就继续访问左右子树
        if (node.left != null) {
            recurision(node.left);
            path.removeLast(); // 回溯
        }

        if (node.right != null) {
            recurision(node.right);
            path.removeLast(); // 回溯
        }
    }
}

下面我画了一个图解,描述递归过程

image-20230114194214068

2. 利用栈

利用栈同时保存结点信息和路径信息。

  • 首先根结点入栈
  • 只要是栈不为空,就出栈。因此根结点首先出栈,根结点的左右孩子入栈。
  • 然后一直进行循环,每次判断出栈元素是否为叶子,如果是叶子,则保存路径。
public ArrayList<ArrayList<Integer>> binaryTreePaths(TreeNode root) {
    ArrayList<ArrayList<Integer>> arrayList = new ArrayList<>();
    if (root == null) return arrayList;
    // 根结点入栈
    Stack<Object> stack = new Stack<>();
    stack.push(new ArrayList<Integer>(root.val));
    stack.push(root);
    // 开始循环
    while (!stack.isEmpty()) {
      // 取出结点
        TreeNode node = (TreeNode) stack.pop();
        ArrayList<Integer> path = (ArrayList<Integer>) stack.pop();

        // 判断是不是叶子结点
        if (node.left == null || node.right == null) {
            // 如果是叶子结点
            arrayList.add(path);
        }
        // 如果不是叶子结点
        if (node.right != null) {
            stack.push(new ArrayList<>(path).add(node.right.val));
            stack.push(node.right.val);
        }
        if (node.left != null) {
            stack.push(new ArrayList<>(path).add(node.left.val));
            stack.push(node.left.val);
        }
    }
    return arrayList;
}

下面用一个图来掩饰一下:

image-20230114202835668

3. 利用层序遍历记录路径

我们可以使用层序遍历。使用两个队列来记录,一个队列用来实现层序遍历,另一个队列用来记录经过的路径。当遍历到叶子结点的时候, 就把路径保存带pathList

public ArrayList<ArrayList<Integer>> binaryTreePaths(TreeNode root) {
    ArrayList<ArrayList<Integer>> pathList = new ArrayList<>();
    if (root == null) return pathList;

    // 根结点入队
    Queue<TreeNode> nodeQ = new LinkedList<>();
    Queue<ArrayList<Integer>> pathQ = new LinkedList<>();
    nodeQ.offer(root);
    pathQ.offer(new ArrayList<>(Arrays.asList(root.val)));

    while (!nodeQ.isEmpty()) {
      // 出队
        TreeNode node = nodeQ.poll();
        ArrayList<Integer> currentPath = pathQ.poll();

        // 判断是否为叶子结点
        if (node.left == null && node.right == null) {
            pathList.add(currentPath);
        }
        if (node.left != null) {
            nodeQ.offer(node.left);
            ArrayList<Integer> temp = new ArrayList<>(currentPath);
            temp.add(node.left.val);
            pathQ.offer(temp);
        }
        if (node.right != null) {
            nodeQ.offer(node.right);
            ArrayList<Integer> temp = new ArrayList<>(currentPath);
            temp.add(node.right.val);
            pathQ.offer(temp);
        }
    }
    return pathList;
}

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

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

相关文章

IDEA 开发工具

文章目录IDEA 开发工具一、IDEA 概述二、IDEA 下载和安装1. IDEA 下载2. IDEA 安装三、IDEA 中的第一个代码1. IDEA 项目结构介绍2. IDEA 中的第一个代码1&#xff09;创建 Project 项目2&#xff09;创建 Module 模块3&#xff09;创建 class 类4&#xff09;在类中编写代码5&…

C++指针

指针的基本概念 作用&#xff1a;通过指针间接访问内存。 内存编号从0开始&#xff0c;一般使用16进制表示。 可以利用指针变量保存地址。 指针变量定义和使用 数据类型*变量名 #include<iostream> using namespace std;int main(){//定义指针int a10;//指针定义语…

绕线机-排线伺服速度解算FC(比例随动编程应用)

绕线机模型和算法详细讲解,专栏已有几篇介绍文章,这篇属于补充和升华。在介绍这篇文章算法之前大家有必要了解什么是"随动系统"。相关链接如下: 绕线机机械结构相关介绍: S7-200 SMART PLC和V20变频器绕线机控制应用_RXXW_Dor的博客-CSDN博客_plc绕线机绕线机P…

循迹小车基本原理和代码实现

目录 一、循迹模块使用 二、接线方式 三、循迹小车原理 四、代码实现 一、循迹模块使用 1、TCRT5000传感器的红外发射二极管不断发射红外线&#xff0c;当发出的红外线没有被反射回来或被反射回来但强度不太够时&#xff0c;红外接收管一直处于关断状态&#xff0c;此时模…

将本地SpringBoot微服务制作成Docker Image镜像包然后运行

将本地SpringBoot微服务制作成Docker Image镜像包然后运行 文章目录将本地SpringBoot微服务制作成Docker Image镜像包然后运行1&#xff09;环境准备2&#xff09;验证jar包3&#xff09;制作images镜像包4&#xff09;注意1&#xff09;环境准备 准备一个SpringBoot项目&…

音视频笔记

音视频笔记 基础理论知识 雷神的博客 [总结]视音频编解码技术零基础学习方法 视频压缩 H264码流结构 码流结构&#xff1a;原来你是这样的H264 H265码流结构 音视频基础&#xff1a;H265/HEVC&码流结构 FFMPEG 雷神的博客 [总结]FFMPEG视音频编解码零基础学习方法…

1583_AURIX_TC275_SMU的控制以及FSP

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) SMU的软件控制接口主要是实现了一些控制命令&#xff0c;用于控制SMU的状态机以及FSP。具体的内容在上面的一部分表格以及接下来的一页中的表格中有介绍。 涉及到ed命令&#xff0c;用几个…

NC6 Error to init aggVOStyle,Please check the back log

由于近期调整及抵消模板的公式字段长度不够&#xff0c;就修改了元数据的字符长度&#xff0c;结果导致修改保存后保存&#xff0c;报错如下&#xff08;如果大家有什么好的解决方案&#xff0c;欢迎评论留言一起探讨学习&#xff09;&#xff1a; 错误日志&#xff1a; 11:1…

Slurm中集群配置文件slum.conf

1.slurm.conf简介slurm.conf是一个ASCII文件&#xff0c;它描述了一般的Slurm 配置信息、要管理的节点、有关如何将这些节点分组到分区中&#xff0c;以及各种调度与这些分区关联的参数。此文件应为在群集中的所有节点上保持一致。可以通过设置SLURM_CONF在执行时修改文件位置 …

初识网络:IP、端口、网络协议、TCP-IP五层模型

目录 一、了解IP地址&#xff1a; 二、了解端口号: 三、网络协议 网络协议的三要素: ①语法 ②语义 ③时序 四、协议的分层(TCP/IP五层模型&#xff09; ①应用层 ②传输层&#xff08;也称为运输层&#xff09; ③网络层 ④数据链路层 ⑤物理层 五、A用户通过QQ给B发送一…

【Java基础知识 2】Java中常用的48个关键字和2个保留字 || Java命名规范(从此告别起名难)

本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; 目录 本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; Java中常用的48个关键字和2个保留字 关键字 保留字 Java命名规范&#xff08;从此告别起名难&#xff09; 01、包&#xff08;package&#…

Spring MVC 整合 Shiro 权限控制

Apache Shiro 是一个功能强大且灵活的开放源代码安全框架&#xff0c;可以细粒度地处理认证 (Authentication)&#xff0c;授权 (Authorization)&#xff0c;会话 (Session) 管理和加密 (cryptography) 等企业级应用中常见的安全控制流程。 Apache Shiro 的首要目标是易于使用和…

python实现excel和csv中的vlookup函数

本篇博客会介绍如何使用python在excel和csv里实现vlookup函数的功能&#xff0c;首先需要简单了解一下python如何操作excel 1. python处理excel 1.1 删除excel中指定行 在文件夹里创建了一个excel文件&#xff0c;可以看到里面放的是三国人物的数据 会发现在【蜀】里&#…

ESP-IDF:在C++环境下实现动态数组例程,包括初始化,添加数值,查找,删除,打印等功能

代码&#xff1a; /* 动态数组 */ struct DYNAMICARRAY { int *pAddress; int size; int capacity; }; DYNAMICARRAY *initialDynamicArray() { DYNAMICARRAY *p (DYNAMICARRAY *)malloc(sizeof(DYNAMICARRAY)); p->size 0; p->capacity 5; p->pAddress (int *)…

数据结构与算法--python版-01

文章目录基本概念数据存储方式算法案例基本概念 程序 数据结构 算法 数据结构&#xff0c;数据的存储&#xff08;物理结构&#xff09;及相互间的关联关系(逻辑结构)&#xff1b; 线性表&#xff08;顺序表、链表、队列、栈&#xff09;&#xff0c;一个前驱&#xff0c;一…

口语语言理解最新进展及前沿

口语语言理解 作为任务型对话系统的核心组件&#xff0c;目的是为了获取用户询问语句的框架语义表示信息&#xff0c;进而将这些信息为对话状态的追踪模块DSTDSTDST, 以及自然语言生成模块NLGNLGNLG所使用 SLUSLUSLU任务通常包含以下两个任务: 意图识别任务: intent detectio…

企企购商城 | 破解降本难题,非生采购“利器”来了

近年来&#xff0c;疫情反复无常&#xff0c;全球市场环境动荡不安&#xff0c;在瞬息万变的环境下&#xff0c;很多企业都处于降本处境&#xff0c;采购降本成了其中的重要一环。其中&#xff0c;非生采购作为贯穿企业各个职能板块的采购活动&#xff0c;众多国际先进的企业已…

应用PID算法对ABS系统的仿真和分析

1、内容简介略635-论文V2 可以交流、咨询、答疑2、内容说明摘要&#xff1a;本文旨在设计一种利用模糊控制理论优化的pid控制器&#xff0c;控制abs系统&#xff0c;达到对滑移率最佳控制范围的要求 &#xff0c;所提出的方案采用级联控制架构&#xff1a;设计用于外环中的车轮…

零基础开始QT绘图(6)

前面我们开始提到了GraphicView的使用&#xff0c;也提到GraphicsItem的使用&#xff0c;并且开始了自定义GraphicsItem的编写&#xff0c;而且上次我们的GraphicsItem也是可以拖动了&#xff0c;但这离我们需要的效果还有一定的距离。 所以&#xff0c;这次&#xff0c;我们进…

工程电磁设备在2018年杭州电磁大会的报告

1 方法原理 本篇是对多频电磁方法,应用的解读。 本汇报讲述了EMI传感器的基本情况,以及用手持多频电磁仪进行实际探测应用的例子。 什么是电磁感应?用发射装置(TX)激发谐波,产生一次场(Primary field),地下导体目标会相应产生涡流电磁场,产生二次场,被接收装置(RX…