Leetcode 求根节点到叶节点数字之和

在这里插入图片描述
使用深度优先搜索 DFS 来做
我提供的代码使用的是 深度优先搜索(DFS,Depth-First Search) 算法。以下是具体的算法思想和实现步骤的解释:


算法思想

  1. 树的路径代表数字

    • 树中每条从根节点到叶子节点的路径可以看作一个整数。例如路径 1 -> 2 -> 3 表示数字 123。这个数字的计算方式是将路径上每个节点的值按照十进制规则累加。
  2. 递归计算路径值

    • 遍历树时,将当前节点的值加到路径数值中,更新为当前路径的数值 currentSum,公式为:
      currentSum = currentSum * 10 + node.val
      
      每深入一层,就将路径数字向左移一位并加上当前节点的值。
  3. 终止条件:叶子节点

    • 当到达一个叶子节点时,这条路径所表示的数字已经完整,直接返回这个数字。
  4. 递归累加左右子树路径的数字

    • 如果当前节点不是叶子节点,那么递归遍历其左子树和右子树,返回左右子树路径数字的总和。
  5. 空节点处理

    • 如果当前节点为空,返回 0,表示当前路径对最终结果没有贡献。

算法流程

  1. 从根节点开始,将路径数值初始化为 0
  2. 对树进行深度优先遍历:
    • 更新路径数值:当前路径的数字由上一级路径的值累加当前节点的值。
    • 终止条件:如果当前节点是叶子节点,返回当前路径的值。
    • 递归累加:如果当前节点有子节点,递归调用左右子树,将左右子树的结果累加。
  3. 最终返回所有路径数值的总和。

伪代码描述

  • 递归方法 dfs(node, currentSum)
    1. 如果当前节点为空,返回 0
    2. 更新当前路径的数值:currentSum = currentSum * 10 + node.val
    3. 如果当前节点是叶子节点,直接返回当前路径的数值 currentSum
    4. 否则,对左右子树分别递归,累加左右子树的路径数值和并返回。

复杂度分析

  1. 时间复杂度

    • 每个节点都被访问一次,递归遍历整棵树,因此时间复杂度是 O(N),其中 N 是树中节点的个数。
  2. 空间复杂度

    • 递归的栈深度取决于树的高度。如果是平衡二叉树,树高为 log(N),空间复杂度为 O(log(N))。如果是链状结构(退化为链表),最坏情况空间复杂度为 O(N)

例子分析

假设输入如下树:

    1/ \2   3
  • 路径从根节点 1 出发,依次到达叶子节点 23
  • 执行流程
    1. 初始调用 dfs(1, 0),将 currentSum 设为 0
    2. 进入根节点 1currentSum = 0 * 10 + 1 = 1
    3. 递归左子树,调用 dfs(2, 1),更新路径值:currentSum = 1 * 10 + 2 = 12,返回 12
    4. 递归右子树,调用 dfs(3, 1),更新路径值:currentSum = 1 * 10 + 3 = 13,返回 13
    5. 最终返回左右子树的和:12 + 13 = 25

核心思想总结

  • 将路径问题抽象为树的递归遍历,通过递归累加路径数值。
  • 使用深度优先搜索,可以有效地对每一条路径进行独立计算,最终累加结果。
  • 通过递归的参数传递路径值,不需要额外的数据结构记录路径信息,从而节省了内存。

java 实现

class Solution {public int sumNumbers(TreeNode root) {return dfs(root, 0);}private int dfs(TreeNode node, int currentsum) {if(node == null) return 0;currentsum = currentsum * 10 + node.val;if(node.left == null && node.right == null) {return currentsum;}return dfs(node.left, currentsum) + dfs(node.right, currentsum);}
}

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

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

相关文章

IDEA:2023版远程服务器debug

很简单,但是很多文档没有写清楚,wocao 一、首先新建一个远程jvm 二、配置 三、把上面的参数复制出来 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 四、然后把这串代码放到服务器中(这里的0.0.0.0意思是所有IP都能访问&a…

计算机毕业设计 | SpringBoot+vue汽车资讯网站 汽车购买咨询管理系统(附源码+论文)

1,绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理汽车资讯网站的相关信息成为必然…

RedHat系统配置静态IP

1、执行nmtui命令进入字符配置界面如下图所示 2、选择编辑连接进入 3、选择编辑进入后,将IPv4设置为手动模式后,选择显示后进行ip地址、网关、DNS的配置,配置完成后选择确定退出编辑 4、进入主界面后选择启用连接进入后,选择启用&…

Android开发教程案例源码分享-匹配动画多个头像飘动效果

Android开发教程案例源码分享-匹配动画多个头像飘动效果 匹配往往出现多个头像飘动,吸引人点击,有时出现的位置还不固定 一、思路: 用MotionLayout 二、效果图: 看视频更直观点: Android开发教程案例源码分享-匹配…

设计LRU缓存

LRU缓存 LRU缓存的实现思路LRU缓存的操作C11 STL实现LRU缓存自行设计双向链表 哈希表 LRU(Least Recently Used,最近最少使用)缓存是一种常见的缓存淘汰算法,其基本思想是:当缓存空间已满时,移除最近最少使…

SAM-Med2D 训练完成后boxes_prompt没有生成mask的问题

之前对着这这篇文章去微调SAM_Med2D(windows环境),发现boxes_prompt空空如也。查找了好长时间问题SAM-Med2D 大模型学习笔记(续):训练自己数据集_sam训练自己数据集-CSDN博客 今天在看label2image_test.json文件的时候发现了一些端倪: 官方…

39页PDF | 毕马威_数据资产运营白皮书(限免下载)

一、前言 《毕马威数据资产运营白皮书》探讨了数据作为新型生产要素在企业数智化转型中的重要性,提出了数据资产运营的“三要素”(组织与意识、流程与规范、平台与工具)和“四重奏”(数据资产盘点、评估、治理、共享)…

在 macOS 和 Linux 中,波浪号 `~`的区别

文章目录 1、在 macOS 和 Linux 中,波浪号 ~macOS示例 Linux示例 区别总结其他注意事项示例macOSLinux 结论 2、root 用户的主目录通常是 /root解释示例切换用户使用 su 命令使用 sudo 命令 验证当前用户总结 1、在 macOS 和 Linux 中,波浪号 ~ 在 macO…

【LeetCode每日一题】——485.最大连续 1 的个数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 LeetCode 三【题目编号】 485.最大连续 1 的个数 四【题目描述】 给定…

windows 操作系统下载 Android源码教程

前言 开始我是装了hyber-v 虚拟机ubuntu 的,然而非常的卡顿且难用。因此我尝试在windows上使用repo,因此有了这篇文章 补充 第二天发现编译源码也需要linux命令因为源码中的很多脚本都是.sh的 因此最终通过安装WSL解决(在window应用商店就…

单片机进阶硬件部分_day2_项目实践

设计要求 从绘制原理图到画PCB板,完成智能云衣柜项目 STM32 (Modbus)云IOT衣物云端管理 华为PCB布线规范 基于IoT的智享家主控系统 步骤分析 需求分析 器件选型绘制原理图(器件连接)PCB布局、布线泪滴、铺铜、添加丝印…

接口上传视频和oss直传视频到阿里云组件

接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…

Flutter:photo_view图片预览功能

导入SDK photo_view: ^0.15.0单张图片预览&#xff0c;支持放大缩小 import package:flutter/material.dart; import package:photo_view/photo_view.dart;... ...class _MyHomePageState extends State<MyHomePage>{overrideWidget build(BuildContext context) {return…

【Linux】详解僵尸进程与孤儿进程(Z僵死状态引发的内存泄漏与处理办法)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 引言 一、僵尸进程 1.子进程的创建与退出 2.进程表 3.僵尸状态产生 4.直观感受一下&#xff1a; 二、…

基于微信小程序的科学健身助手的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

【Pytorch】torch.utils.data模块

torch.utils.data模块主要用于进行数据集处理&#xff0c;是常用的一个包。在构建数据集的过程中经常会用到。要使用data函数必须先导入&#xff1a; from torch.utils import data 下面介绍几个经常使用到的类。 torch.utils.data.DataLoader DataLoader(dataset, batch_…

Qt在designer设计师界面使用QSplitter

QSplitter控件是解决软件不同分辨率自适应布局的好帮手之一&#xff0c;该控件无法在控件列表找到&#xff0c;使用条件较为隐蔽 环境 qt5.12.12 MSVC2017 1.新建一个qt项目&#xff0c;初始自带Mainwindow&#xff0c;拖两个qwidget进来&#xff0c;注意此时centralWidget处于…

北京申请中级职称流程(2024年)

想找个完整详细点的申请流程资料真不容易&#xff0c;做个分享送给需要的人吧。 不清楚为什么说文章过度宣传&#xff0c;把链接和页面去掉了&#xff0c;网上自己找一下。 最好用windows自带的EDGE浏览器打开申请网站&#xff0c;只有在开始申请的时间内才可以进行网上申报&…

测评部署和管理 WordPress 最方便的面板

新版宝塔面板快速搭建WordPress新手教程 - 倚栏听风-Morii - 博客园 初学者使用1Panel面板快速搭建WordPress网站 - 倚栏听风-Morii - 博客园 可以看到&#xff0c;无论是宝塔还是1Panel&#xff0c;部署和管理WordPress都有些繁琐&#xff0c;而且还需要额外去配置Nginx和M…

ubuntu:20.04安装协议逆向工具netzob

创建容器 docker run -d --name ubuntu_env ubuntu:20.04 /bin/bash -c "while true; do sleep 1; done" 63a8f5cf5431a930671ff0e7bb2b667adf001efb05fd7261da244879d2699bec 进入容器 PS E:\src> docker exec -it ubuntu_env /bin/bash 安装常用工具 apt upda…