【二叉樹(DFS) - LeetCode】437. 路徑總和 III

?437. 路徑總和 III

題解:DFS

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:long long rootSum(TreeNode* root, long long targetSum){if(!root){return 0;}int res = 0;if(root->val == targetSum){res ++;}res += rootSum(root->left, targetSum - root->val);res += rootSum(root->right, targetSum - root->val);return res;} long long pathSum(TreeNode* root, long long targetSum){if(!root){return 0;}int res = rootSum(root, targetSum);res += pathSum(root->left, targetSum);res += pathSum(root->right,targetSum);return res;}
};

題解-通俗易懂

發現AI講題還挺有意思。單獨加上一個 Section。

想象一下,你在一棵大樹上尋寶,這棵樹的每個樹枝節點上都標有一個數字。你的任務是找到所有從某個節點出發,往下走,路徑上所有數字加起來正好等于“目標寶藏值”(targetSum)的路線有多少條。

重要規則:這個路線不一定非要從最頂端的樹根開始,也不一定非要走到最末端的葉子。它可以從任何一個節點開始,到它下面的任何一個節點結束。

這段代碼用了“分工合作”的策略,設計了兩個函數來完成這個任務:

  1. rootSum:一個“專一的探路者”。

  2. pathSum:一個“總指揮官”。


1.?rootSum?函數詳解 (專一的探路者)

rootSum?的任務非常簡單和專一:它只負責尋找那些【必須】從當前我給它的這個節點 (root) 出發的尋寶路線。

我們來看看它是怎么工作的:

codeC++

long long rootSum(TreeNode* root, long long targetSum){// 如果這個節點是空的(路到頭了),那肯定沒路可走,返回 0 條。if(!root){return 0;}int res = 0; // 準備一個計數器,記錄找到了幾條路// 1. 先看看我自己是不是一個寶藏?//    就我一個節點,不多也不少,如果我的值正好等于目標值,那恭喜,找到了一條!if(root->val == targetSum){res++;}// 2. 接下來,我要把路往下延伸,去我的左子樹里繼續找。//    既然我已經走了我這一步 (root->val),那么接下來的路需要湊夠的數就是 `targetSum - root->val`。//    于是我喊來另一個 `rootSum` 小分隊,告訴它:“喂,從我的左孩子出發,幫我找找和為 `targetSum - root->val` 的路有多少條?”res += rootSum(root->left, targetSum - root->val);// 3. 同理,我也要去我的右子樹里繼續找。//    我也喊來另一個 `rootSum` 小分隊,讓它從我的右孩子出發,繼續完成剩下的任務。res += rootSum(root->right, targetSum - root->val);// 把上面三步找到的路線總數加起來,就是從我這個節點出發的所有尋寶路線數量。return res;
}

rootSum?的小結:?你給它一個起點和一個目標值,它就勤勤懇懇地從這個起點往下走,告訴你從這個起點出發,有多少條路線的和恰好是那個目標值。


2.?pathSum?函數詳解 (總指揮官)

pathSum?的任務是總攬全局。它知道尋寶路線可以從?任何一個節點?開始,而?rootSum?只會從指定的節點開始。那怎么辦呢?

很簡單,pathSum?就遍歷樹上的每一個節點,然后對每一個節點都說:“喂,rootSum,現在輪到你上場了,把這個節點當做起點,去給我找路!”

我們來看看它的指揮過程:

codeC++

long long pathSum(TreeNode* root, long long targetSum){// 如果整棵樹都是空的,那肯定一條路都沒有。if(!root){return 0;}// 這里的總路線數,可以分成三個部分:// 1. 從【當前這個根節點】出發的路線。// 2. 完全在【左子樹】內部的路線 (起點和終點都在左子樹里)。// 3. 完全在【右子樹】內部的路線 (起點和終點都在右子樹里)。// 第一部分:讓 `rootSum` 這個專家出馬,計算一下從當前 `root` 節點出發的路線有多少條。int res = rootSum(root, targetSum);// 第二部分:我不管從當前節點出發的路了,我去它的左子樹里看看。// 對左子樹來說,它也是一棵完整的樹,里面也可能藏著各種尋寶路線。// 于是我對自己下了一個同樣的命令(遞歸調用):“喂,另一個我,去左子樹里執行一遍完整的 `pathSum` 任務!”res += pathSum(root->left, targetSum);// 第三部分:同理,我也要去右子樹里執行一遍完整的 `pathSum` 任務。res += pathSum(root->right, targetSum);// 把這三部分找到的路線數量全部加起來,就是最終的答案。return res;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95002.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95002.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95002.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python】shutil.make_archive() 方法詳解

文章目錄功能概述函數簽名核心參數詳解1. base_name2. format3. root_dir4. base_dir使用示例將 /home/user/project/data 目錄打包為 data.tar.gz,并保存到 /home/user/backups/打包當前工作目錄下的 docs 文件夾為 zip 文件替代方案總結shutil.make_archive() 是 …

CAN總線(Controller Area Network Bus)控制器局域網總線(二)

6、錯誤幀 總線上所有設備都會監督總線的數據,一旦發現“位錯誤”或“填充錯誤”或“CRC錯誤”或“格式錯誤”或“應答錯誤” ,這些設備便會發出錯誤幀來破壞數據,同時終止當前的發送設備。7、過載幀 當接收方收到大量數據而無法處理時&#…

LeetCode 317 離建筑物最近的距離

LeetCode 317 題的詳細題目信息如下:題目名稱Shortest Distance from All Buildings(中文譯名:離建筑物最近的距離)題目描述給你一個由 0、1 和 2 組成的二維網格,其中:0 代表空地1 代表建筑物2 代表障礙物…

AI之CodeTool之Kode:Kode(claude_code風格)的簡介、安裝和使用方法、案例應用之詳細攻略

AI之CodeTool之Kode:Kode(claude_code風格)的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 相關文章 LLMs之PE之SystemPrompt:analysis_claude_code的簡介、使用方法、案例應用之詳細攻略 AI之CodeTool之Kode:Kode(claude_code風格)的簡…

網絡請求優化:用 Retrofit 攔截器玩轉日志、重試與緩存,OkHttp 和 Volley 誰更香?

目錄 1. 攔截器:Retrofit 的“超級管理員” 攔截器的本質 為什么用攔截器? 2. 日志攔截器:讓請求和響應“現原形” 引入日志攔截器 實現日志攔截器 日志輸出示例 生產環境注意事項 3. 重試攔截器:網絡不穩定也能穩如狗 設計重試邏輯 集成到 Retrofit 優化重試策…

LeetCode - 283. 移動零

題目 283. 移動零 - 力扣(LeetCode) 思路 我們使用左右兩個指針:左指針left指向已處理好的非零元素的末尾位置,右指針right用于遍歷數組。 算法步驟: 初始化left為-1(表示還沒有處理任何非零元素&…

Redis不同場景下的注意事項

Redis常見的 使用場景: 緩存系統(核心場景) 存儲熱點數據,減少數據庫訪問壓力。提升接口響應速度。技術點: 用String/Hash 存儲結構化數據結合過期時間(TTL)和緩存淘汰策略(如LRU)管理內存。解決緩存問題:穿…

【完整源碼+數據集+部署教程】高速公路施工區域物體檢測系統源碼和數據集:改進yolo11-RepNCSPELAN

背景意義 隨著城市化進程的加快,高速公路建設與維護工作日益頻繁,施工區域的安全管理成為亟待解決的重要問題。在高速公路施工區域,工人和設備的安全是首要考慮因素,而有效的物體檢測系統能夠顯著提高施工現場的安全性與工作效率。…

如何在FastAPI中玩轉全鏈路追蹤,讓分布式系統故障無處遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全鏈路追蹤如何讓FastAPI微服務架構的每個請求都無所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全鏈路追蹤是現代微服務架構中監控系統行為的核心技術,通…

Win11 壓縮實測:Win11 的壓縮軟件的最佳配置和使用方式

文章目錄測試環境機器配置被壓縮文件WinRAR7zipLinux子系統準備極限壓縮減小字典的極限壓縮7zipWin11準備極限壓縮7zip系統內置右鍵壓縮菜單極限壓縮總結:Win11 的壓縮軟件的最佳配置和使用方式測試環境 機器配置 Win11系統 16GB內存 8核CPU 被壓縮文件 文件夾內…

CMake構建學習筆記22-libxml2庫的構建

在上一篇文章《CMake構建學習筆記21-通用的CMake構建腳本》中,筆者封裝了一個通用的cmake構建腳本cmake-build.ps1,那么這里筆者就嘗試通過這個腳本來構建libxml2庫。 libxml2是GNOME項目下的XML庫,雖然比不上TinyXML-2輕量,但是…

虛擬私有網絡筆記

VPN應用場景 ——VPN概述 ? 利用公共網絡來構建的私人專用網絡稱為虛擬私有網絡(VPN, Virtual Private Network),用于構建VPN的公共網絡包括Internet 、幀中繼、ATM等。在公共網絡上組建的VPN象企業現有的私有網絡 一樣提供安全性…

Python 輕量級 HTML 解析器 - lxml入門教程

文章目錄初始化解析器路徑查找查找所有標簽查找指定 id 的標簽查找指定 class 的標簽查找包含指定 class 的標簽復雜路徑查找示例1示例2常見操作獲取所有標簽的鏈接獲取 div 標簽的文本內容, 其他標簽類似其他元素操作初始化解析器 from lxml import html from lxml.html impor…

(CVPR-2025)VideoMage:文本生成視頻擴散模型的多主體與動作定制化

VideoMage:文本生成視頻擴散模型的多主體與動作定制化 paper title:VideoMage: Multi-Subject and Motion Customization of Text-to-Video Diffusion Models paper是National Taiwan University發表在CVPR 2025的工作 Code:鏈接 圖1. 多主體與動作定制化…

OpenCV輪廓近似與Python命令行參數解析

在計算機視覺任務中,輪廓分析是目標檢測、形狀識別的核心步驟。而approxPolyDP函數作為輪廓簡化的關鍵工具,能有效減少輪廓頂點數量,降低計算復雜度;同時,argparse庫則能讓Python腳本更靈活、易用。本文將結合具體案例…

基于Springboot在線音樂推薦平臺

目錄 一、項目介紹 二、功能介紹 三、核心代碼 四、效果圖 源碼獲取 前言 在經濟繁榮的浪潮過去后,社會的焦點逐漸從物質追求轉向了文化和生活品質的提升[1]。文化生活的繁榮成為人們關注的焦點之一,而音樂,作為文化的一部分&#xff0…

LeetCode算法日記 - Day 26: 歸并排序、交易逆序對的總數

目錄 1. 歸并排序 1.1 題目解析 1.2 解法 1.3 代碼實現 2. 交易逆序對的總數 2.1 題目解析 2.2 解法 2.3 代碼實現 1. 歸并排序 912. 排序數組 - 力扣(LeetCode) 給你一個整數數組 nums,請你將該數組升序排列。 你必須在 不使用任…

C++(Qt)軟件調試---vcpkg安裝crashpad(34)

C(Qt)軟件調試—vcpkg安裝crashpad(34) 文章目錄C(Qt)軟件調試---vcpkg安裝crashpad(34)[toc]1 概述🐜2 環境配置3 qt使用crashpad庫捕獲異常4 cmake中添加crashpad5 相關地址🐐更多精彩內容👉內…

Kafka 副本同步異常與 ISR 收縮故障排查實錄

背景 某高流量 Kafka 集群(原 10G 網卡)在切中心時頻繁觸發帶寬報警,擴容至 25G 網卡后出現副本同步異常: 操作流程:停機→升級網卡→重啟→觸發分區同步→切換首選 Leader現象: 寫入流量上升后&#xff0c…

頂點 (VS)vs 片段(FS):OpenGL紋理滾動著色器的性能博弈與設計哲學

一個微妙的選擇,影響整個應用性能表現在實時圖形渲染中,實現紋理滾動效果是一種常見需求。但當我們在頂點著色器和片段著色器之間做出不同實現選擇時,會對性能產生顯著影響。今天,我們將深入探討這兩種實現的差異,幫助…