首页 > 编程语言 >257. 力扣(LeetCode)二叉树的所有路径(JAVA)

257. 力扣(LeetCode)二叉树的所有路径(JAVA)

时间:2024-11-09 18:49:46浏览次数:3  
标签:paths JAVA 递归 Get res LeetCode 二叉树 root 节点

一、目标

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

二、代码解读

总代码:

/**
 * 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<String> binaryTreePaths(TreeNode root) {
        //创建储存路径结果的List
        ArrayList<String> res = new ArrayList<>();
        //创建储存当前路径的List
        ArrayList<Integer> paths = new ArrayList<>();
        Get(root, res, paths);
        return res;
    }
    public void Get(TreeNode root, ArrayList<String> res, ArrayList<Integer> paths){
        /*每次调取Get函数要先将当前的节点值记录起来,
          因为后续递归逻辑是遍历到叶子节点结束,不先记录下来会漏掉
        */
        paths.add(root.val);
        if(root.left == null && root.right == null){
            StringBuilder sb = new StringBuilder();
            //如果递归到叶子节点,则进行当前路径的储存,储存到res中
            for(int i = 0; i < paths.size(); i++){
                 //这里Leetcode储存路径形式要求为:a->b->c
                 sb.append(paths.get(i) + (i == paths.size() - 1 ? "" : "->") );
            }
            res.add(sb.toString());
        }
        //递归调用Get方法
        if(root.left != null){
            Get(root.left, res, paths);
            //加一次回溯,删除上一次记录的节点值
            paths.remove(paths.size() - 1);
        }
        //同上
        if(root.right != null){
            Get(root.right, res, paths);
            paths.remove(paths.size() - 1);
        }
    }
}

  递归第一步:确定返回值类型和传入参数

  本方法是对两个动态数组进行操,无需返回值。

public void Get(TreeNode root, ArrayList<String> res, ArrayList<Integer> paths)

  递归第二步:确定递归终止条件

  if判断逻辑为直到递归到叶子节点,将当前记录在paths中的路径记录到结果res中。

  注:每次调取Get()方法都会先记录当前节点值到路径中,因为记录到叶子节点结束,不在调取方           法第一时间将节点值加入paths中会导致最后叶子节点无法被正确记录到res结果中。

        /*每次调取Get函数要先将当前的节点值记录起来,
          因为后续递归逻辑是遍历到叶子节点结束,不先记录下来会漏掉
        */
        paths.add(root.val);
        if(root.left == null && root.right == null){
            StringBuilder sb = new StringBuilder();
            //如果递归到叶子节点,则进行当前路径的储存,储存到res中
            for(int i = 0; i < paths.size(); i++){
                 //这里Leetcode储存路径形式要求为:a->b->c
                 sb.append(paths.get(i) + (i == paths.size() - 1 ? "" : "->") );
            }
            res.add(sb.toString());
        }

  递归第三步:确定单层逻辑

   每层都会递归调取Get()方法,每一层执行完Get(执行到叶子节点)之后都要将上一次记录的节点值删除,然后在当前层继续递归执行。

        //递归调用Get方法
        if(root.left != null){
            Get(root.left, res, paths);
            //加一次回溯,删除上一次记录的节点值
            paths.remove(paths.size() - 1);
        }
        //同上
        if(root.right != null){
            Get(root.right, res, paths);
            paths.remove(paths.size() - 1);
        }

  三、总结

   记录路径的递归方法中要注意每次的回溯删除。

标签:paths,JAVA,递归,Get,res,LeetCode,二叉树,root,节点
From: https://blog.csdn.net/zzb1580/article/details/143591195

相关文章

  • Java毕业设计-基于SSM的新生报到系统【代码+论文+PPT+开题】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SSM数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能个人中心:提供学生个人信息查看与编辑,以及报到进度......
  • java毕业设计-基于SSM的购物商城系统【代码+论文+PPT+开题+任务书】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SSM数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能个人中心:管理用户个人信息,包括资料编辑、密码修改......
  • java毕业设计-基于ssm的汽车配件销售业绩管理系统【代码+论文+PPT+任务书+开题报告】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SSM数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能个人中心:管理用户个人信息,包括账户设置、资料编辑......
  • JAVA自动化扫描并使用Driver进行小型DDOS-----JAVA
    packagecom.alatus.searchinfo.config;importcom.alatus.searchinfo.Entity.AccountEntity;importcom.alatus.searchinfo.utils.HttpUtils;importcom.alibaba.excel.context.AnalysisContext;importcom.alibaba.excel.metadata.CellExtra;importcom.alibaba.excel......
  • PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点?
    相信每一个计算机科班出身的同学或许都有这样的经历:在大三的某一天,仿佛打通了全身筋脉一般把三年的所学:“数电里的与非门——[计算机体系结构]——汇编语言——C语言——C++语言——Java语言”。所有知识全部串联了起来。所有这些语言的出现都仿佛都有了必然性和追根溯源的历史......
  • 全新版Java面试八股文合集(495道)
     过滤器和拦截器区别(这个问题基础,没想到问的频率挺高,还容易回答不好)他们都可以在请求的过程中插入一手,他们的请求过程如下:当一个请求过来时,会交给web服务器提供的过滤器,再来到servert。有一个叫DispatchServert的servert,在它里面就会调用我们的拦截器,再由我们的DispatchSer......
  • 代码随想录算法训练营第十七天| 654.最大二叉树 , 617.合并二叉树 , 700.二叉搜索树中的
    654.最大二叉树文章链接:https://programmercarl.com/0654.最大二叉树.html题目链接:https://leetcode.cn/problems/maximum-binary-tree/description/classSolution{public:TreeNode*traversal(vector<int>&nums,intleft,intright){if(left>=right)ret......
  • 11.9 javaweb学习 day2 基础标签&样式
    网页响应流程浏览器前端服务器后端服务器数据库1.浏览器请求前端2.前端响应浏览器3.浏览器请求后端4.后端请求数据库5.数据库响应后端6.后端响应浏览器网页的组成1.网页的文字,图片,音频,视频,超链接什么的,本质是前端代码2.前端代码通过浏览器的转化......
  • LeetCode 3014[输入单词需要的最少按键次数I]
    题目链接LeetCode3014[输入单词需要的最少按键次数I]详情实例实例1实例2提示题解思路一圈下来8个字母,每个字母按1次二圈下来16个字母,前8个字母每个按1次,后8个字母,每个按2次三圈下来24个字母,前8个字母每个按1次,中间8个字母,每个按2次,最后8个字母,每个按3次四圈下来......
  • LeetCode128 最长连续序列
    最长连续序列题目链接:LeetCode128描述给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。示例输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它......