算法的学习笔记—二叉树中和为某一值的路径

embedded/2024/10/19 2:22:13/

img

😀前言
在二叉树中寻找和为某一特定值的路径问题是一个经典的面试题,考察了对二叉树的遍历能力以及递归和回溯算法的理解和应用。本文将详细解析这一问题,并提供一个Java实现。

🏠个人主页:尘觉主页

文章目录

  • 😄二叉树中和为某一值的路径
    • 🥰问题描述
    • 💖解题思路
    • 😀Java代码实现
      • 代码解析
      • 时间复杂度分析
    • 😄总结

😄二叉树中和为某一值的路径

🥰问题描述

给定一棵二叉树和一个整数,要求找出所有从树的根结点开始,到叶结点结束,结点值的和等于给定整数的路径。路径定义为从根节点开始一直到叶子节点所经过的所有节点。

例如,下面的二叉树有两条路径的节点值之和为 22:

ed77b0e6-38d9-4a34-844f-724f3ffa2c12

路径分别是:

  • 10 -> 5 -> 7
  • 10 -> 12

💖解题思路

要解决这个问题,可以使用深度优先搜索(DFS)结合回溯法进行路径的遍历与选择。核心思想是从根节点开始,逐步减去当前节点的值,如果在到达叶子节点时,剩余的值刚好为0,则找到了一个符合条件的路径。以下是详细的实现步骤:

  1. 递归遍历树:从根节点开始,递归地遍历左子树和右子树。
  2. 回溯法:在递归过程中,记录当前路径,并在递归返回时将路径回溯,即将最后一个节点移除,这样可以在不同的路径中复用同一个路径列表。
  3. 判断条件:在每次递归中,检查当前节点是否为叶子节点且路径的节点值之和是否等于目标值,如果是,则将当前路径记录下来。

😀Java代码实现

import java.util.ArrayList;class TreeNode {int val;  // 当前节点的值TreeNode left;  // 左子节点TreeNode right;  // 右子节点TreeNode(int x) { val = x; }
}public class Solution {private ArrayList<ArrayList<Integer>> ret = new ArrayList<>();  // 用于存储所有符合条件的路径/*** 主函数,用于查找所有路径* @param root 根节点* @param target 目标和* @return 返回所有路径的列表*/public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {backtracking(root, target, new ArrayList<>());  // 从根节点开始进行回溯return ret;  // 返回结果集}/*** 回溯函数,递归查找路径* @param node 当前节点* @param target 剩余的目标和* @param path 当前路径*/private void backtracking(TreeNode node, int target, ArrayList<Integer> path) {if (node == null) {return;  // 如果当前节点为空,直接返回}path.add(node.val);  // 将当前节点值加入路径target -= node.val;  // 更新目标值,减去当前节点的值// 判断是否达到目标值且当前节点为叶子节点if (target == 0 && node.left == null && node.right == null) {ret.add(new ArrayList<>(path));  // 如果满足条件,将当前路径加入结果集} else {// 递归处理左子树backtracking(node.left, target, path);// 递归处理右子树backtracking(node.right, target, path);}// 回溯,移除路径中的最后一个节点path.remove(path.size() - 1);}
}

代码解析

  • ret:保存所有符合条件的路径,是一个包含多个路径的列表。
  • FindPath:主函数,初始化递归过程并返回结果。
  • backtracking:核心递归函数。参数 node 为当前处理的节点,target 为剩余需要匹配的值,path 保存当前路径。

在每次递归中,首先判断当前节点是否为 null,如果是,则直接返回。否则,将节点值加入当前路径并更新目标值。若目标值为0且当前节点为叶子节点,则将当前路径加入结果集中。最后一步是回溯,将当前路径中的最后一个节点移除,继续尝试其他路径。

时间复杂度分析

算法的时间复杂度主要取决于二叉树的深度和每个节点的访问次数。最坏情况下,需要遍历二叉树的每一条路径,其复杂度为 O(N),其中 N 是树中节点的数量。

😄总结

通过本文的讲解,相信大家对如何在二叉树中寻找和为某一特定值的路径有了更加深入的理解。通过深度优先搜索和回溯法,我们可以有效地解决这一问题。Java实现中的递归思路清晰且简洁,适用于面试中的二叉树相关问题。

😁热门专栏推荐
学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img


http://www.ppmy.cn/embedded/100090.html

相关文章

编程小白到大神之路

编程已成为现代大学生必不可少的技能之一 一、编程的基本概念 编程是将特定算法或逻辑转换为计算机可以理解的语言&#xff0c;通过指令控制计算机实现某种功能。掌握编程不仅能提升逻辑思维能力&#xff0c;还有助于解决实际问题。 二、主要特点 逻辑性强&#xff1a;编程需…

Python爬虫-实现自动获取随机请求头User-Agent

前言 本文是该专栏的第36篇,后面会持续分享python爬虫干货知识,记得关注。 在爬虫项目中,User-Agent 字符串扮演着非常关键的角色。User-Agent 是一个特殊的 HTTP 请求头字段,由客户端(在这种情况下,主要是爬虫或浏览器)发送到服务器,以告诉服务器关于客户端(如浏览器…

CSS+JS实现一个鼠标移动的高亮边框效果

一、过程分析 先上效果&#xff1a; 在Windows系统里有一个很棒的细节效果&#xff0c;元素的渐变高亮边框是可以感知鼠标的&#xff0c;边框的高亮部分会跟随鼠标的移动而移动。 这种效果也是比较常见的&#xff0c;但是实现起来还是需要一点时间和思路的。 首先&#xff0…

C/C++控制台贪吃蛇游戏的实现

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 一、…

.NET_web前端框架_layui_栅格布局

基础概念 layui:用于简化前端编写的框架。响应式布局&#xff08;Responsive Layout&#xff09;:一种网页设计方法&#xff0c;使网页能够根据不同设备的屏幕尺寸和分辨率自动调整其内容和布局。栅格布局&#xff08;Grid Layout&#xff09;:一种网页设计布局方法&#xff0c…

页面设计任务 商品详情页

目录 成品: 任务描述 源码&#xff1a; 详细讲解&#xff1a; 1.导航栏讲解 2.主体部分 3.图像部分 4.评分部分 5.按钮部分 6.配置信息部分 7.响应式设计 成品: 任务描述 创建一个产品展示页面&#xff0c;包括以下内容&#xff1a; 网页结构&#xff1a;使用 HTM…

一拖二快充线市场需求 - LDR6020

一拖二快充线市场需求与LDR6020应用快充线市场推广 随着科技的飞速发展&#xff0c;智能设备已成为我们日常生活中不可或缺的一部分。从智能手机到平板电脑&#xff0c;再到笔记本电脑&#xff0c;这些设备极大地丰富了我们的生活方式&#xff0c;但同时也带来了一个普遍的问题…

Node.js 文件系统

Node.js 文件系统 Node.js 的文件系统&#xff08;File System&#xff09;模块提供了一种方式&#xff0c;允许开发者使用 JavaScript 代码来访问和操作计算机的文件系统。这个模块是 Node.js 标准库的一部分&#xff0c;因此不需要安装额外的依赖就可以直接使用。文件系统模…