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

2024-08-23 12:52

本文主要是介绍算法的学习笔记—二叉树中和为某一值的路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/1099432

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig