二叉树路径与回溯法

简介: 文章通过LeetCode第257题"二叉树路径"的解题过程,详细阐述了如何利用前序遍历和回溯法来找出二叉树中所有从根节点到叶子节点的路径,并提供了Java语言的代码实现,强调了回溯法在解决类似问题中的重要性。

前言

算法是计算机软件的基础,常见算法是软件开发的核心基本功,今年打算深入学习一些算法,记录一些算法理论以及最佳实践,希望可以坚持下去,关注我,我们一起学习,增强我们的基本功。

二叉树的路径

leetcode第257题需要查找二叉树的所有路径。

image.png

二叉树的路径就是根节点到每个叶子节点之间的路径。

我们只要使用前序遍历,每次遍历到叶子节点的时候收集一次路径,直到遍历到最后一个叶子节点,所有路径都可以收集完成。

比如下方二叉树,总共有3条路径

image.png

路径1: 8 5 3

路径2: 8 5 6,我们可以发现求路径2的时候,我们只要回到5这个节点,再遍历右节点6就可以得到路径2,这就是回溯的过程。

路径3: 8 9, 我们可以发现求路径3的时候,我们只要回到8这个节点,再遍历右节点9就可以得到路径3,这也是回溯的过程。

编码求二叉树的路径

/**
 * 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 {
   
   
    List<String> result = new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
   
   
        List<Integer> subResult = new ArrayList<>();
        binaryTreePaths2(root, subResult);
        return result;
    }

    //递归和回溯求解二叉树路径
    public void  binaryTreePaths2(TreeNode root, List<Integer> subResult) {
   
   
        //前序遍历,按中左右顺序遍历
        subResult.add(root.val);
        if(root.left == null && root.right == null) {
   
   
            String r = "";
            for(int i=0; i<subResult.size(); i++) {
   
   
                if(i>0) {
   
   
                    r = r + "->" + subResult.get(i);
                } else {
   
   
                    r += subResult.get(i);
                }

            }
            result.add(r);
            return;
        }
        //遍历左子树
        if(root.left != null) {
   
   
            binaryTreePaths2(root.left, subResult);
            //这里其实就是回溯
            subResult.remove(subResult.size()-1);
        }
        //遍历右子树
        if(root.right != null) {
   
   
            binaryTreePaths2(root.right, subResult);
            //这里其实就是回溯
            subResult.remove(subResult.size()-1);
        }

    }
}

总结

看完今天的题目,发现回溯和递归是一起出现的。回溯是回退部分递归走过的路径,再接着继续遍历其他节点。

看完上面的代码,再看看这张图,是不是更好理解回溯了。 image.png

嘿,既然看到这里了,关注我们,一起学习技术,一起变强。

image.png

相关文章
|
XML JSON 数据格式
如何在langchain中对大模型的输出进行格式化
我们知道在大语言模型中, 不管模型的能力有多强大,他的输入和输出基本上都是文本格式的,文本格式的输入输出虽然对人来说非常的友好,但是如果我们想要进行一些结构化处理的话还是会有一点点的不方便。
|
机器学习/深度学习 数据采集 监控
构建高效机器学习模型的五大关键步骤
在数据科学领域,搭建一个高效的机器学习模型是实现数据驱动决策的核心。本文详细阐述了从数据预处理到模型评估五个关键步骤,旨在为读者提供一个清晰的建模流程。文中不仅介绍了各个步骤的理论依据,还结合了实用的技术细节,以期帮助读者在实际工作中构建出既健壮又精确的机器学习系统。
630 5
|
Web App开发 数据采集 JSON
Python实现urllib3和requests库使用 | python爬虫实战之五
本节介绍了urllib3库和requests库中的一些方法的使用。
Python实现urllib3和requests库使用 | python爬虫实战之五
|
运维 负载均衡 网络协议
从底层技术来看,GSLB 究竟难在哪儿
本文作者吕宏利来自硅谷的SRE,有着多年的国内外大型互联网公司运维开发经验,专注于分布式系统设计、监控、容量规划,数据中心技术以及生产环境的最佳实践。在本文中他将他将向读者介绍什么是GSLB,以及实现细节和维护方法。
9186 0
|
消息中间件 存储 RocketMQ
2分钟看懂RocketMQ延迟消息核心原理
本文从源码层面解析了RocketMQ延迟消息的实现原理,包括延迟消息的使用、Broker端处理机制以及定时任务对延迟消息的处理流程。
2分钟看懂RocketMQ延迟消息核心原理
|
数据采集 数据管理 数据挖掘
CDGP|数据治理策略揭秘:因企制宜,实现精准管控新高度
数据治理是指通过制定一系列政策、流程和技术手段,对企业数据进行全面、系统、规范的管理。它不仅能够确保数据的准确性、一致性和安全性,还能提升数据的质量和价值,为企业决策提供有力支持。因此,制定数据治理策略的首要任务是明确其核心价值,确保策略能够服务于企业的整体战略目标。
|
编解码 文字识别 测试技术
论文介绍:TextMonkey——面向文本理解的无OCR大型多模态模型
【5月更文挑战第2天】TextMonkey是一款无OCR的大型多模态模型,设计用于高效提取文本信息。它采用Shifted Window Attention和零初始化技术处理高分辨率文档,减少训练成本。通过假设图像中的冗余标记,模型能精简标记并提升性能。TextMonkey还能定位文本答案在图像中的位置,增强可解释性,在场景文本任务和关键信息提取中表现优越,特别是在OCRBench基准测试中刷新记录。然而,它在处理小图像和需要深层推理的任务时仍面临挑战。[链接](https://arxiv.org/abs/2403.04473)
502 5
OTA升级常见错误码汇总-CSDN博客
OTA升级常见错误码汇总-CSDN博客
1398 0
|
开发框架 前端开发 机器人
从模型到前端,你应该知道的LLM生态系统指南
LLM在在2023年发展的风生水起,一个围绕LLM的庞大生态系统正在形成,本文通过介绍这个生态系统的核心组成部分,来详细整理LLM的发展。
1077 2
|
Java
线程 - 一句话说明白 Java 线程池中 shutdown 和 shutdownNow 的区别
线程 - 一句话说明白 Java 线程池中 shutdown 和 shutdownNow 的区别
989 0