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

news2024/9/27 0:26:54

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 = val
        self.left = left
        self.right = right

# BFS方法返回层数最深的叶子节点的和
def deepestLeavesSumBFS(root):
    if not root:
        return 0

    queue = deque([root])
    while queue:
        level_sum = 0
        for _ in range(len(queue)):
            node = queue.popleft()
            level_sum += node.val
            if 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   9
    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)

    result = deepestLeavesSumBFS(root)
    print("层数最深的叶子节点的和 (BFS):", result)  # 应该输出24

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

# 定义二叉树节点类
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# DFS方法返回层数最深的叶子节点的和
def deepestLeavesSumDFS(root):
    if not root:
        return 0

    max_depth = -1
    sum_at_max_depth = 0

    def dfs(node, depth):
        nonlocal max_depth, sum_at_max_depth
        if not node:
            return

        # 如果是叶子节点
        if not node.left and not node.right:
            if depth > max_depth:
                max_depth = depth
                sum_at_max_depth = node.val
            elif depth == max_depth:
                sum_at_max_depth += node.val
        else:
            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   9
    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)

    result = deepestLeavesSumDFS(root)
    print("层数最深的叶子节点的和 (DFS):", result)  # 应该输出24

go实现

广度优先搜索(BFS)

package main

import (
	"fmt"
)

// TreeNode 定义二叉树节点
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// deepestLeavesSumBFS 使用广度优先搜索(BFS)返回层数最深的叶子节点的和
func deepestLeavesSumBFS(root *TreeNode) int {
	if root == nil {
		return 0
	}

	queue := []*TreeNode{root}
	var levelSum int

	for len(queue) > 0 {
		levelSum = 0
		qLen := len(queue)
		for i := 0; i < qLen; i++ {
			node := queue[0]
			queue = queue[1:]
			levelSum += node.Val
			if 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   9
	root := &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 main

import (
	"fmt"
)

// TreeNode 定义二叉树节点
type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// deepestLeavesSumDFS 使用深度优先搜索(DFS)返回层数最深的叶子节点的和
func deepestLeavesSumDFS(root *TreeNode) int {
	if root == nil {
		return 0
	}

	var maxDepth int
	var sumAtMaxDepth int

	var 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 = depth
				sumAtMaxDepth = 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   9
	root := &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? = null
    var right: TreeNode? = null
}

// BFS方法返回层数最深的叶子节点的和
fun deepestLeavesSumBFS(root: TreeNode?): Int {
    if (root == null) return 0

    var sum = 0
    val queue: Queue<TreeNode> = LinkedList()
    queue.add(root)

    // 广度优先搜索(BFS)
    while (queue.isNotEmpty()) {
        sum = 0 // 重置当前层的和
        val size = queue.size
        for (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   9
    val 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? = null
    var right: TreeNode? = null
}

// DFS方法返回层数最深的叶子节点的和
fun deepestLeavesSumDFS(root: TreeNode?): Int {
    if (root == null) return 0

    var maxDepth = -1
    var sumAtMaxDepth = 0

    fun dfs(node: TreeNode?, depth: Int) {
        if (node == null) return

        // 如果是叶子节点
        if (node.left == null && node.right == null) {
            if (depth > maxDepth) {
                maxDepth = depth
                sumAtMaxDepth = 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   9
    val 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.coloradmin.cn/o/1909733.html

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

相关文章

16张支付牌照将到期,新规落地以来,支付牌照的首次续展。

7月9日&#xff0c;包括瑞银信、乐刷、畅捷支付在内的16家第三方支付机构的支付牌照将到期&#xff0c;这些公司面临续展的重大考验。 这是《非银行支付机构监督管理条例》实施以来&#xff0c;支付牌照的首次续期。 其中&#xff0c;最受瞩目的可能是瑞银信。在范一飞落马后&a…

AI绘画:艺术与科技的交融,创新浪潮与无限可能

在科技日新月异的当下&#xff0c;AI 绘画作为人工智能领域的一颗璀璨新星&#xff0c;正以惊人的速度在国内崭露头角&#xff0c;引发了艺术与技术交融的全新变革。随着人工智能技术的飞速发展&#xff0c;AI绘画已成为艺术与科技交融的新宠。2024年&#xff0c;AI绘画行业在国…

最新版萌新Python看过最好的电子书?

我之前写过一篇 Python 入门看哪些书的文章&#xff0c;文章中罗列了 5 位大佬的书单推荐&#xff0c;在这个基础上我总结了自己看过的书单。你要是不知道学 Python 看什么书好&#xff0c;不妨参考一下&#xff1a; 一晃就到了月末&#xff0c;2020年也过去了 2 个月&#xf…

mysql数据库中的视图view的概念和详细说明

目录 一、定义 二、视图view的分类 &#xff08;一&#xff09;按功能和特性分类 1、普通视图&#xff08;Regular View/Standard View&#xff09; 2、索引视图&#xff08;Indexed View&#xff09; 3、分割视图&#xff08;Partitioned View/Distributed Partitioned …

【pytorch23】MNIST测试实战

理解 训练完之后也需要做测试 为什么要做test&#xff1f; 上图蓝色代表train的accuracy 下图蓝色代表train的loss 基本上符合预期&#xff0c;随着epoch增大&#xff0c;train的accuracy也会上升&#xff0c;loss也会一直下降&#xff0c;下降到一个较小的程度 但是如果只看…

世上最懂交易原理的是佛学

僧肇《肇论不空真论》思想非有非無逻辑 价值观矛盾冲突时&#xff08;不落两边&#xff09;&#xff0c;血性即行迹逻辑&#xff08;俗谛&#xff09;&#xff0c;才气即逻辑心证&#xff08;真谛&#xff09;&#xff1b;意气即是美&#xff0c;美即是意气&#xff1b;一切以…

使用bypy丝滑传递百度网盘-服务器文件

前言 还在为百度网盘的数据集难以给服务器做同步而痛苦吗&#xff0c;bypy来拯救你了&#xff01;bypy是一个强大而灵活的百度网盘命令行客户端工具。它是基于Python开发的开源项目&#xff0c;为用户提供了一种通过命令行界面与百度网盘进行交互的方式。使用bypy&#xff0c;…

仿写SpringIoc

1.SpringIoc简单注解 1.1 Autowired package com.qcby.iocdemo1.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.FIEL…

Git 快速上手

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

音视频开发—FFmpeg处理流数据的基本概念详解

文章目录 多媒体文件的基本概念相关重要的结构体操作数据流的基本步骤1.解复用&#xff08;Demuxing&#xff09;2.获取流&#xff08;Stream&#xff09;3. 读取数据包&#xff08;Packet&#xff09;4. 释放资源&#xff08;Free Resources&#xff09;完整示例 多媒体文件的…

聚焦云技术,探讨 AGI 时代的云原生数据计算系统

6月22日&#xff0c;开源中国社区在上海举办了 OSC 源创会活动&#xff0c;本期活动以「云技术」为主题&#xff0c;邀请了来自华为 openEuler、字节跳动、AutoMQ 等厂商的技术大咖进行分享&#xff0c;拓数派作为云原生数据计算领域的引领者&#xff0c;受邀参与了本次活动&am…

智慧城市可视化页面怎么做?免费可视化工具可以帮你

智慧城市是一个综合性的概念&#xff0c;广泛应用于各个领域&#xff0c;如基础设施建设、信息化应用、产业经济发展、市民生活品质等。 可视化页面的制作也是一个综合性的过程&#xff0c;需要确定展示内容、数据收集与处理、设计可视化元素等多个环节紧密配合。 1. 明确展示…

MySQL Innodb存储引擎中,当页默认的大小是16K时,页中最多存放多少行的记录?

1、题目引入 Innodb存储引擎是面向行的(row-oriented)&#xff0c;也就是说数据的存放按行进行&#xff0c;每页存放的行记录是有硬性定义的&#xff0c;当页默认的大小是16K时&#xff0c;页中最多存放多少行的记录&#xff1f; A、1600 行B、8192 行C、16383 行D、7992 行 …

occ geo

随笔 - 12 文章 - 18 评论 - 117 阅读 - 13万 opencascade造型引擎功能介绍 现今的CAD 系统大多通常都基于CAD 系统提供的二次开发包&#xff0c;用户根据要求定制符合自己要求的功能。AutoCAD就提供了AutoLISP、ADS 等都是比较通用的开发工具包。UG 也提供了多种二次开发…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…

grafana数据展示

目录 一、安装步骤 二、如何添加喜欢的界面 三、自动添加注册客户端主机 一、安装步骤 启动成功后 可以查看端口3000是否启动 如果启动了就在浏览器输入IP地址&#xff1a;3000 账号密码默认是admin 然后点击 log in 第一次会让你修改密码 根据自定义密码然后就能登录到界面…

机器学习笔记:初始化0的问题

1 前言 假设我们有这样的两个模型&#xff1a; 第一个是逻辑回归 第二个是神经网络 他们的损失函数都是交叉熵 sigmoid函数的导数&#xff1a; 他们能不能用0初始化呢&#xff1f; 2 逻辑回归 2.1 求偏导 2.1.1 结论 2.1.2 L对a的偏导 2.1.3 对w1&#xff0c;w2求偏导 w2同…

k8s record 20240708

一、PaaS 云平台 web界面 资源利用查看 Rancher 5台 CPU 4核 Mem 4g 100g的机器 映射的目录是指docker重启后&#xff0c;数据还在 Rancher可以创建集群也可以托管已有集群 先docker 部署 Rancher&#xff0c;然后通过 Rancher 部署 k8s 想使用 kubectl 还要yum install 安…

中国AI大模型论文数量全球第一,清华力压麻省理工、斯坦福

论文是研究新技术、开发新产品获取“图纸”的重要途径之一&#xff0c;OpenAI的研究人员正是借鉴了Transformer的论文&#xff08;被引用超过9万次&#xff09;&#xff0c;才开发出了对全球各行业影响巨大的产品ChatGPT。 而论文的数量、通过率和被引用次数是衡量一个国家科技…

电脑文件夹怎么设置密码?让你的文件更安全!

在日常使用电脑的过程中&#xff0c;我们常常会有一些需要保护的个人文件或资料。为了防止这些文件被他人未经授权访问&#xff0c;对重要文件夹设置密码是一种有效的保护措施&#xff0c;可是电脑文件夹怎么设置密码呢&#xff1f;本文将介绍2种简单有效的方法帮助您为电脑文件…