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.pswp.cn/diannao/43511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43511.shtml
英文地址,請注明出處:http://en.pswp.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;二&#…

車道線識別研究

想研究車道線識別的深度學習網絡… 目錄 1.車道線數據集匯總及研究1.1 CULane Datesets1.1.1 相關連接1.1.2 介紹 1.2 Tusimple1.3 LLAMAS1.4 APOLLOSCAPE 2.車道線檢測框架2.1 LaneNet&#xff1a;實時車道線檢測框架 1.車道線數據集匯總及研究 參考文檔&#xff1a; 1.車道線…

sysbench 搭建使用

1.下載地址&#xff1a; https://github.com/akopytov/sysbench/tree/0.5 2.安裝 #進入解壓目錄&#xff0c;并且創建安裝目錄&#xff1a; unzip sysbench-0.5.zip cd sysbench-0.5#安裝依賴包 yum -y install automake autoconf libtool mysql-devel#準備編譯 ./autogen.s…

【初階數據結構】深入解析隊列:探索底層邏輯

初階數據結構相關知識點可以通過點擊以下鏈接進行學習一起加油&#xff01;時間與空間復雜度的深度剖析深入解析順序表:探索底層邏輯深入解析單鏈表:探索底層邏輯深入解析帶頭雙向循環鏈表:探索底層邏輯深入解析棧:探索底層邏輯深入解析隊列:探索底層邏輯深入解析循環隊列:探索…

三、Python日志系統之監控郵件發送

import smtplib from email.mime.text import MIMEText import time import os import datetime from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler# 郵件配置 SMTP_SERVER smtp.example.com SMTP_PORT 587 SMTP_USERNAME your_…

EXISTS、NOT EXISTS、IN和NOT IN辨析

文章目錄 概要EXISTSNOT EXISTSINNOT IN辨析 概要 EXISTS、NOT EXISTS、IN 和 NOT IN 是 SQL 中用于查詢時進行條件判斷的關鍵字&#xff0c;它們在功能上有相似之處&#xff0c;但使用場景和性能表現上有所不同。 EXISTS 1.用途&#xff1a;用于子查詢中&#xff0c;判斷子…

C++:cv.absdiff函數含義

在OpenCV庫中&#xff0c;absdiff函數是一個非常重要的圖像處理函數&#xff0c;其意義在于計算兩個輸入數組&#xff08;通常是圖像&#xff09;之間對應元素差的絕對值。這個函數在圖像處理和計算機視覺領域有著廣泛的應用&#xff0c;如圖像對比、運動檢測等。 函數的基本用…

python第三方庫【numpy.array】的使用(超詳細)

NumPy 是 Python 中用于科學計算的基礎庫之一&#xff0c;它提供了高性能的多維數組對象以及這些數組的操作。NumPy 的核心數據結構是 ndarray&#xff08;N-dimensional array&#xff0c;N維數組&#xff09;&#xff0c;它提供了一種高效的存儲和操作大型多維數組的方法。以…

熬了一晚上,我從零實現了 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++:cv.contourArea()函數解析

cv::contourArea是OpenCV庫中用于計算輪廓面積的函數。該函數非常適用于圖像處理中的形狀分析、物體檢測等領域。以下是關于cv::contourArea的詳細介紹&#xff1a; 一、函數概述 cv::contourArea是OpenCV中用于計算封閉輪廓面積的函數。它接受一個輪廓作為輸入&#xff0c;并…

Fedora 41 移除 Python 2支持

2024年的今天&#xff0c;在 Python 3 發布 16 年后&#xff0c;Fedora 發行版項目宣布 Fedora 41 將移除 Python 2.7。 除了 PyPy&#xff0c;Fedora 41 以及之后的版本將不再有 Python 2.7。運行時或構建時需要 python2.7 的軟件包也將面臨退役。 Fedora 41 將包含圖像處理…

C++ 十進制與十六進制之間相互轉換

十進制與十六進制之間相互轉換 10_to_16 與二進制類似&#xff0c;十進制轉十六進制對16整除&#xff0c;得到的余數的倒序即為轉換而成的十六進制&#xff0c;特別地&#xff0c;如果超過10以后&#xff0c;分別用ABCDEF或abcdef來代替10、11、12、13、14、15。 代碼1: #in…