【算法设计与分析】求根节点到叶节点数字之和

       📝个人主页:五敷有你      

 🔥系列专栏:算法分析与设计

⛺️稳中求进,晒太阳

题目

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。

计算从根节点到叶节点生成的 所有数字之和 。

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

示例 

示例

示例 1:

输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12从根到叶子节点路径 1->3 代表数字 13因此,数字总和 = 12 + 13 = 25

示例 2:

输入:root = [4,9,0,5,1]
输出:1026
解释:从根到叶子节点路径 4->9->5 代表数字 495从根到叶子节点路径 4->9->1 代表数字 491从根到叶子节点路径 4->0 代表数字 40。因此,数字总和 = 495 + 491 + 40 = 1026

思路(递归)

        你可以使用深度优先搜索(DFS)来遍历树的所有路径。对于每个节点,你可以递归地计算从根节点到该节点的路径所代表的数字,并将其加到总和中。当遇到叶节点时,将路径所代表的数字加到总和中。

这里我们使用递归来解决这个问题。递归是一种解决问题的方法,其中函数调用自身来解决更小规模的问题。在树的情境下,递归特别适用,因为树的结构本身就是递归定义的。

递归函数的核心思路如下:

  1. 基本情况(终止条件)如果当前节点为空,则返回 0。
  2. 计算当前路径所代表的数字将当前路径的数字计算出来,即将当前的数字乘以 10 再加上当前节点的值。
  3. 处理叶子节点如果当前节点是叶子节点(即没有左右子节点),则返回当前路径所代表的数字。
  4. 递归左右子树对当前节点的左右子树分别调用递归函数,将当前路径所代表的数字传递给它们,并将它们返回的结果相加。
  5. 返回结果将左右子树返回的结果相加,得到从当前节点开始的所有路径所代表的数字之和。

我们就能够递归地计算出从根节点到每个叶子节点的路径所代表的数字之和。

代码实现

/*** 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 int sumNumbers(TreeNode root) {return sum(root,0);}public int sum(TreeNode root,int i){if(root==null) return 0;int temp=i*10+root.val;if(root.left==null&&root.right==null){return temp;}return sum(root.left,temp)+sum(root.right,temp);}
}

运行结果

时间复杂度为 O(N),其中 N 表示树的节点数量。

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

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

相关文章

python多进程共享字典方案

三者对比 先给出demo代码: import time from multiprocessing import Managerfrom UltraDict import UltraDictdef mul():t1 time.time()d Manager().dict()t2 time.time()for i in range(100000):d[i] iprint(f"[multiple] insert value: {time.time() - t2} s&quo…

【深度学习: AutoAugment】使用 AutoAugment 提高深度学习性能

【深度学习: AutoAugment】使用 AutoAugment 提高深度学习性能 结果 深度学习在计算机视觉领域的成功可以部分归因于大量标记训练数据的可用性——随着训练数据的质量、多样性和数量的增加,模型的性能通常会提高。然而,收集足够的高质量数据来…

cesium mapboxgl+threebox glb 朝向问题

一、3Dbuilder打开glb 二、cesium在pitch和heading都为0的情况下,不设置模型的朝向 三、mapboxglthreebox在pitch和bearing都为0的情况下,不设置模型的朝向 四、对于地图默认视角,cesium设置pitch-90、heading0的时候和mapboxglthreebox设置p…

2023年全国职业院校技能大赛软件测试赛题第3套

2023年全国职业院校技能大赛 软件测试赛题第3套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 …

【Linux C | I/O模型】IO复用 | poll、ppoll函数详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台!需要xss平台接收flag, http协议需要http协议的xss平台打开场景后界面如下: 解题思路 看到此类的题目,应该和存储型xss有关,也就是将恶意代码保存到服务器端即然在服务器端,那就…

(2024,VLM,操纵链)CogCoM:训练大型视觉语言模型,通过操作链深入细节

CogCoM: Train Large Vision-Language Models Diving into Details through Chain of Manipulations 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 方法 2.1. 术语 2.2…

C语言之自定义类型:联合和枚举

目录 1. 联合体类型的声明2. 联合体的特点3. 联合体大小的计算联合的一个练习 4. 枚举类型的声明5. 枚举类型的优点6. 枚举类型的使用 1. 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型 但是编译器只为最大…

一篇文章了解Python中的对象(狠狠爱住)

Python中的对象 在Python中,对象是面向对象编程的核心。几乎Python中的一切都是对象,包括数字、字符串、函数、类等。每个对象都有一个身份、一个类型和一个值。 对象的特性 身份(Identity):每个对象都有一个唯一的身…

SpringBoot全局异常捕获处理实现方案

在Spring Boot中实现全局异常处理可以通过以下方式: 使用ControllerAdvice注释创建一个全局异常处理类,并使用ExceptionHandler注释来定义具体异常的处理方法。 import your.package.IllegalNumberException; import org.springframework.http.HttpSta…

java面试题:MySQL中的各种JOIN的区别

表关联是频率非常高的一种数据库操作,在MySQL中,这种JOIN操作有很多类型,包括内联接、左外连接、右外连接等等,而每种连接的含义都不一样,如果死记硬背,不仅很难记住,而且也容易搞混淆&#xff…

前端页面禁止debugger调试并跳转空白页面----文心一言官网实现方式

技术点:setInterval定时器Object.defineProperty 背景: 某天打开文心一言想看看接口返回结构是怎样的,熟练的打开浏览器开发者工具查看网络请求。 发现出现了以下debugger断点 这难不倒我,去掉断点调试,继续下一步不…