leetcode--层数最深叶子节点的和

leetcode地址:层数最深叶子节点的和
给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和 。
示例 1:

在这里插入图片描述

输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15
示例 2:

输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]
输出:19

提示:

树中节点数目在范围 [1, 104] 之间。
1 <= Node.val <= 100

实现思路

广度优先搜索(BFS):

使用队列进行层次遍历,逐层扫描树。
每次进入新的一层时,重置当前层的和。
记录当前层的叶子节点和,直到遍历完整棵树。
深度优先搜索(DFS):

使用递归方法,记录每个节点的层数。
通过递归遍历树,更新当前层数和最深层叶子节点和。
返回最深层叶子节点和。

代码详解

广度优先搜索(BFS)
使用广度优先搜索(BFS)遍历树,每次进入新的一层时,重置当前层的和,并累加当前层的叶子节点值,直到遍历完整棵树。

from collections import deque# 定义二叉树节点类
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# BFS方法返回层数最深的叶子节点的和
def deepestLeavesSumBFS(root):if not root:return 0queue = deque([root])while queue:level_sum = 0for _ in range(len(queue)):node = queue.popleft()level_sum += node.valif node.left:queue.append(node.left)if node.right:queue.append(node.right)return level_sum# 测试示例
if __name__ == "__main__":# 创建测试二叉树#        1#       / \#      2   3#     / \   \#    4   5   6#   /       / \#  7       8   9root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)root.right.right = TreeNode(6)root.left.left.left = TreeNode(7)root.right.right.left = TreeNode(8)root.right.right.right = TreeNode(9)result = deepestLeavesSumBFS(root)print("层数最深的叶子节点的和 (BFS):", result)  # 应该输出24

深度优先搜索(DFS)
使用深度优先搜索(DFS)遍历树,记录每个节点的层数。通过递归遍历树,更新当前层数和最深层叶子节点和。

# 定义二叉树节点类
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right# DFS方法返回层数最深的叶子节点的和
def deepestLeavesSumDFS(root):if not root:return 0max_depth = -1sum_at_max_depth = 0def dfs(node, depth):nonlocal max_depth, sum_at_max_depthif not node:return# 如果是叶子节点if not node.left and not node.right:if depth > max_depth:max_depth = depthsum_at_max_depth = node.valelif depth == max_depth:sum_at_max_depth += node.valelse:dfs(node.left, depth + 1)dfs(node.right, depth + 1)dfs(root, 0)return sum_at_max_depth# 测试示例
if __name__ == "__main__":# 创建测试二叉树#        1#       / \#      2   3#     / \   \#    4   5   6#   /       / \#  7       8   9root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)root.right.right = TreeNode(6)root.left.left.left = TreeNode(7)root.right.right.left = TreeNode(8)root.right.right.right = TreeNode(9)result = deepestLeavesSumDFS(root)print("层数最深的叶子节点的和 (DFS):", result)  # 应该输出24

go实现

广度优先搜索(BFS)

package mainimport ("fmt"
)// TreeNode 定义二叉树节点
type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}// deepestLeavesSumBFS 使用广度优先搜索(BFS)返回层数最深的叶子节点的和
func deepestLeavesSumBFS(root *TreeNode) int {if root == nil {return 0}queue := []*TreeNode{root}var levelSum intfor len(queue) > 0 {levelSum = 0qLen := len(queue)for i := 0; i < qLen; i++ {node := queue[0]queue = queue[1:]levelSum += node.Valif node.Left != nil {queue = append(queue, node.Left)}if node.Right != nil {queue = append(queue, node.Right)}}}return levelSum
}// 测试示例
func main() {// 创建测试二叉树//        1//       / \//      2   3//     / \   \//    4   5   6//   /       / \//  7       8   9root := &TreeNode{Val: 1}root.Left = &TreeNode{Val: 2}root.Right = &TreeNode{Val: 3}root.Left.Left = &TreeNode{Val: 4}root.Left.Right = &TreeNode{Val: 5}root.Right.Right = &TreeNode{Val: 6}root.Left.Left.Left = &TreeNode{Val: 7}root.Right.Right.Left = &TreeNode{Val: 8}root.Right.Right.Right = &TreeNode{Val: 9}result := deepestLeavesSumBFS(root)fmt.Printf("层数最深的叶子节点的和 (BFS): %d\n", result) // 应该输出24
}

深度优先搜索(DFS)

package mainimport ("fmt"
)// TreeNode 定义二叉树节点
type TreeNode struct {Val   intLeft  *TreeNodeRight *TreeNode
}// deepestLeavesSumDFS 使用深度优先搜索(DFS)返回层数最深的叶子节点的和
func deepestLeavesSumDFS(root *TreeNode) int {if root == nil {return 0}var maxDepth intvar sumAtMaxDepth intvar dfs func(node *TreeNode, depth int)dfs = func(node *TreeNode, depth int) {if node == nil {return}// 如果是叶子节点if node.Left == nil && node.Right == nil {if depth > maxDepth {maxDepth = depthsumAtMaxDepth = node.Val} else if depth == maxDepth {sumAtMaxDepth += node.Val}} else {dfs(node.Left, depth+1)dfs(node.Right, depth+1)}}dfs(root, 0)return sumAtMaxDepth
}// 测试示例
func main() {// 创建测试二叉树//        1//       / \//      2   3//     / \   \//    4   5   6//   /       / \//  7       8   9root := &TreeNode{Val: 1}root.Left = &TreeNode{Val: 2}root.Right = &TreeNode{Val: 3}root.Left.Left = &TreeNode{Val: 4}root.Left.Right = &TreeNode{Val: 5}root.Right.Right = &TreeNode{Val: 6}root.Left.Left.Left = &TreeNode{Val: 7}root.Right.Right.Left = &TreeNode{Val: 8}root.Right.Right.Right = &TreeNode{Val: 9}result := deepestLeavesSumDFS(root)fmt.Printf("层数最深的叶子节点的和 (DFS): %d\n", result) // 应该输出24
}

Kotlin实现

广度优先搜索(BFS)

import java.util.LinkedList
import java.util.Queue// 定义二叉树节点类
class TreeNode(var `val`: Int) {var left: TreeNode? = nullvar right: TreeNode? = null
}// BFS方法返回层数最深的叶子节点的和
fun deepestLeavesSumBFS(root: TreeNode?): Int {if (root == null) return 0var sum = 0val queue: Queue<TreeNode> = LinkedList()queue.add(root)// 广度优先搜索(BFS)while (queue.isNotEmpty()) {sum = 0 // 重置当前层的和val size = queue.sizefor (i in 0 until size) {val node = queue.poll()sum += node.`val` // 累加当前层节点的值// 将左右子节点加入队列node.left?.let { queue.add(it) }node.right?.let { queue.add(it) }}}return sum
}// 测试示例
fun main() {// 创建测试二叉树//        1//       / \//      2   3//     / \   \//    4   5   6//   /       / \//  7       8   9val root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left?.left = TreeNode(4)root.left?.right = TreeNode(5)root.right?.right = TreeNode(6)root.left?.left?.left = TreeNode(7)root.right?.right?.left = TreeNode(8)root.right?.right?.right = TreeNode(9)val result = deepestLeavesSumBFS(root)println("层数最深的叶子节点的和 (BFS): $result") // 应该输出24
}

深度优先搜索(DFS)

// 定义二叉树节点类
class TreeNode(var `val`: Int) {var left: TreeNode? = nullvar right: TreeNode? = null
}// DFS方法返回层数最深的叶子节点的和
fun deepestLeavesSumDFS(root: TreeNode?): Int {if (root == null) return 0var maxDepth = -1var sumAtMaxDepth = 0fun dfs(node: TreeNode?, depth: Int) {if (node == null) return// 如果是叶子节点if (node.left == null && node.right == null) {if (depth > maxDepth) {maxDepth = depthsumAtMaxDepth = node.`val`} else if (depth == maxDepth) {sumAtMaxDepth += node.`val`}} else {dfs(node.left, depth + 1)dfs(node.right, depth + 1)}}dfs(root, 0)return sumAtMaxDepth
}// 测试示例
fun main() {// 创建测试二叉树//        1//       / \//      2   3//     / \   \//    4   5   6//   /       / \//  7       8   9val root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left?.left = TreeNode(4)root.left?.right = TreeNode(5)root.right?.right = TreeNode(6)root.left?.left?.left = TreeNode(7)root.right?.right?.left = TreeNode(8)root.right?.right?.right = TreeNode(9)val result = deepestLeavesSumDFS(root)println("层数最深的叶子节点的和 (DFS): $result") // 应该输出24
}

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

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

相关文章

多点GRE over IPsecVPN模式下nhrp的调优

一、实验目的 在多点GRE over IPsecVPN模式下对nhrp进行调优&#xff0c;在总部开启重定向、在分支开启shortcut 网络拓扑&#xff1a; 二、基础设置 &#xff08;一&#xff09;如图所示配置接口地址和区域&#xff0c;连接PC的接口位于trust区域、连接路由器的接口位于unt…

qt5.15关于qradiobutton遇到的坑

前言 不知道是只有我遇到了&#xff0c;还是qt本身就存在这个bug 当将2个qradiobutton放入到一个布局内&#xff0c;然后进行来回切换&#xff0c;若无数据刷新的情况下&#xff0c;切换无异常&#xff0c;当窗体内有数据开始刷新了&#xff0c;则点击其中一个qradiobutton&am…

语法糖:代码中的甜品

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

以太网电路相关功能说明

RJ45模块用于PHY芯片之间的互连&#xff0c;如图1所示&#xff0c;RJ45有两种组合形式&#xff0c;一种是分立式&#xff0c;网口变压器和RJ45连接座是分开的&#xff0c;另一种是网口变压器和RJ45集成在一起。 图1 RJ45两种主要形式 接下来以分立式RJ45的百兆网电路做个说明&a…

基于springboot+vue养老院管理系统+lw+源码+讲解+调试+演示视频

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料&#xff0c;分析人员可以根据这些信息确定出本系统具备的功能&#xff0c;分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作&#xff0c;但…

Matlab基础语法篇(上)

Matlab基础语法&#xff08;上&#xff09; 一、基知&#xff08;一&#xff09;界面介绍&#xff08;二&#xff09;常用快捷键&#xff08;三&#xff09;常用指令&#xff08;四&#xff09;Matlab帮助系统 二、运算基础&#xff08;一&#xff09;变量&#xff08;二&#…

【初阶数据结构】深入解析队列:探索底层逻辑

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

熬了一晚上,我从零实现了 Transformer 模型,把代码讲给你听

自从彻底搞懂Self_Attention机制之后&#xff0c;笔者对Transformer模型的理解直接从地下一层上升到大气层&#xff0c;瞬间打通任督二脉。夜夜入睡之前&#xff0c;那句柔情百转的"Attention is all you need"时常在耳畔环绕&#xff0c;情到深处不禁拍床叫好。于是…

客户案例|某大型证券公司数据库运维场景数据安全实践

证券行业涉及股票、债券、基金等金融产品的发行、交易和监管&#xff0c;业务具有数据规模大、数据价值高、数据应用场景复杂的显著特点&#xff0c;其中高速流转的业务系统中含有海量的客户个人信息、交易、行情、咨询等高敏感高价值信息。由于证券期货业务场景所具有的特殊性…

初中生物知识点总结(人教版)

第一章 认识生物 一、 生物的特征&#xff1a; 1&#xff0e; 生物的生活需要营养 2&#xff0e; 生物能进行呼吸 3&#xff0e; 生物能排出身体内产生的废物 4&#xff0e; 生物能对外界的刺激做出反应 5&#xff0e; 生物能生长和繁殖 除病毒以外&#xff0c;生物都是由细胞构…

单例模式(大话设计模式)C/C++版本

单例模式 C 饿汉 /* HM hungry man 饿汉 */ #include <iostream> using namespace std; class Singleton { private:Singleton() { cout << "单例对象创建&#xff01;" << endl; };Singleton(const Singleton &);Singleton &operator(c…

C++ 十进制与十六进制之间相互转换

十进制与十六进制之间相互转换 10_to_16 与二进制类似&#xff0c;十进制转十六进制对16整除&#xff0c;得到的余数的倒序即为转换而成的十六进制&#xff0c;特别地&#xff0c;如果超过10以后&#xff0c;分别用ABCDEF或abcdef来代替10、11、12、13、14、15。 代码1: #in…

【密码学基础】基于LWE(Learning with Errors)的全同态加密方案

学习资源&#xff1a; 全同态加密I&#xff1a;理论与基础&#xff08;上海交通大学 郁昱老师&#xff09; 全同态加密II&#xff1a;全同态加密的理论与构造&#xff08;Xiang Xie老师&#xff09; 现在第二代&#xff08;如BGV和BFV&#xff09;和第三代全同态加密方案都是基…

Git 快速上手

这个文档适用于需要快速上手 Git 的用户&#xff0c;本文尽可能的做到简单易懂 ❤️❤️❤️ git 的详细讲解请看这篇博客 Git 详解&#xff08;原理、使用&#xff09; 1. 什么是 Git Git 是目前最主流的一个版本控制器&#xff0c;并且是分布式版本控制系统&#xff0c;可…

合规与安全双重护航:ADVANCE.AI让跨境支付更无忧

近年来&#xff0c;随着全球化进程的加速和跨境贸易的蓬勃发展&#xff0c;跨境支付的需求大幅增加。根据Grand View Research的报告&#xff0c;2021年全球跨境支付市场规模估计为22.09万亿美元。到2025年&#xff0c;全球跨境支付市场预计将达到35.9万亿美元&#xff0c;较20…

rfid资产管理系统解决方案 rfid固定资产管理系统建设方案

在现代化的仓库储备中&#xff0c;仅仅完成对货物进出的简单批次处理已经不再足够&#xff0c;对库内货品的种类、数量、生产属性、垛位等信息的清晰记录变得至关重要。然而&#xff0c;传统的资产管理方式如条形码在长期使用中逐渐暴露出不耐脏、数据存储量小、读取间隔短、不…

优质可视化大屏模板+动态图表+科技感原件等

优质可视化大屏模板动态图表科技感原件等 软件版本&#xff1a;Axure RP 9 作品类型&#xff1a;高保真 作品内容&#xff1a; 1、大屏可视化模版&#xff08;100套&#xff09;&#xff1a;包含智慧城市、智慧社区、智慧园区、智慧农业、智慧水务、智慧警务、城市交通、电…

新加坡工作和生活指北:教育篇

文章首发于公众号&#xff1a;Keegan小钢 新加坡的基础教育在东南亚处于领先地位&#xff0c;这点基本是人尽皆知&#xff0c;但很多人对其教育体系只是一知半解&#xff0c;今日我们就来深入了解一下。 新加坡的学校主要分为三大类&#xff1a;政府学校、国际学校、私立学校。…

Python 中将字典内容保存到 Excel 文件使用详解

概要 在数据处理和分析的过程中,经常需要将字典等数据结构保存到Excel文件中,以便于数据的存储、共享和进一步分析。Python提供了丰富的库来实现这一功能,其中最常用的是pandas和openpyxl。本文将详细介绍如何使用这些库将字典内容保存到Excel文件中,并包含具体的示例代码…

Xterminal工具的安装与使用体验

Xterminal工具的安装与使用体验 一、Xterminal简介二、Xterminal核心特性三、Xterminal使用场景四、Xterminal下载地址五、Xterminal的基本使用5.1 设置仓库密码5.2 SSH连接5.3 Windows远程桌面5.4 笔记功能5.5 AI工具 六、总结 一、Xterminal简介 Xterminal是一款专为开发者设…