LeetCode算法題(Go語言實現)_36

題目

給定一個二叉樹的根節點 root ,和一個整數 targetSum ,求該二叉樹里節點值之和等于 targetSum 的 路徑 的數目。
路徑 不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。

一、代碼實現(雙重遞歸法)

func pathSum(root *TreeNode, targetSum int) int {if root == nil {return 0}// 計算以當前節點為起點的路徑數 + 左右子樹的路徑數return dfs(root, targetSum) + pathSum(root.Left, targetSum) + pathSum(root.Right, targetSum)
}func dfs(node *TreeNode, remain int) int {if node == nil {return 0}count := 0if node.Val == remain {count++}// 遞歸處理左右子樹,更新剩余目標值count += dfs(node.Left, remain - node.Val)count += dfs(node.Right, remain - node.Val)return count
}

二、算法分析(遞歸法)

1. 核心思路
  • 雙重遞歸結構:外層遞歸遍歷所有節點作為路徑起點,內層遞歸計算以該節點為起點的路徑數目
  • 暴力窮舉:對每個節點及其子樹進行深度優先搜索,統計符合條件的路徑
2. 關鍵步驟
  1. 外層遞歸:遍歷每個節點作為可能的路徑起點
  2. 內層遞歸:以當前節點為起點,向下搜索滿足sum=targetSum的路徑
  3. 終止條件:空節點返回0,當前節點值等于剩余值時計數+1
  4. 狀態傳遞:將剩余值remain - node.Val傳遞給子樹
3. 復雜度
指標說明
時間復雜度O(n2)每個節點觸發一次O(n)的子樹遍歷
空間復雜度O(h)h為樹高度(遞歸棧空間)

三、代碼實現(前綴和優化法)

func pathSum(root *TreeNode, targetSum int) int {prefixSum := make(map[int]int)prefixSum[0] = 1 // 處理根節點自身滿足條件的情況return dfs(root, 0, targetSum, prefixSum)
}func dfs(node *TreeNode, currSum int, target int, prefixSum map[int]int) int {if node == nil {return 0}currSum += node.Valcount := prefixSum[currSum - target]prefixSum[currSum]++count += dfs(node.Left, currSum, target, prefixSum)count += dfs(node.Right, currSum, target, prefixSum)prefixSum[currSum]-- // 回溯return count
}

四、算法分析(前綴和法)

1. 核心思路
  • 前綴和哈希表:記錄從根節點到當前節點的路徑和出現次數
  • 數學關系:若存在currSum - target = oldSum,則oldSum -> currSum的路徑和為target
2. 關鍵步驟
  1. 初始化哈希表:預存prefixSum[0]=1處理根節點自身滿足條件的情況
  2. 更新當前和:累加節點值到currSum
  3. 查詢差值:計算currSum - target的出現次數
  4. 回溯操作:維護哈希表狀態避免子樹間的干擾
3. 復雜度
指標說明
時間復雜度O(n)單次遍歷所有節點
空間復雜度O(n)哈希表存儲n個節點的前綴和

五、圖解示例

root = [10,5,-3,3,2,null,11], targetSum=8為例:

        10/  \5   -3/ \    \3   2   11

前綴和法流程

  1. 路徑10→5→3:和為18 → 18-8=10(無記錄)
  2. 路徑10→5→2:和為17 → 17-8=9(無記錄)
  3. 路徑10→5:和為15 → 15-8=7(無記錄)
  4. 路徑10→-3→11:和為18 → 18-8=10(命中初始0)
    最終計數:3(路徑5→3、路徑5→2→1、路徑-3→11)

六、邊界條件與擴展

1. 特殊場景驗證
  • 空樹:返回0
  • 負數和零:如root = [-2,null,-3], target=-5 → 返回1
  • 重復路徑:多節點值相同的情況需正確計數
2. 擴展應用
  • 多條件路徑統計:同時滿足和值與節點數限制
  • 動態目標值:支持實時修改targetSum的在線查詢
  • 路徑回溯:記錄具體路徑而非僅計數(需維護路徑棧)

七、總結與優化方向

1. 方法對比
方法優勢劣勢適用場景
雙重遞歸實現簡單時間復雜度高小規模樹(n<1000)
前綴和線性時間復雜度需要維護哈希表狀態大規模樹
2. 工程優化
  • 并行計算:對左右子樹進行并發遍歷(Go協程)
  • 內存預分配:根據樹高度預判哈希表容量
  • 數值溢出處理:使用int64存儲累加和
3. 算法擴展
  • K路徑問題:統計和值為targetSum的TopK最長路徑
  • 三維路徑:推廣到三叉樹等復雜結構
  • 流式處理:支持無法完整加載內存的超大樹結構

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

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

相關文章

深度解析:文件或目錄損壞且無法讀取的應對之道

引言 在數字化辦公與數據存儲日益普及的今天&#xff0c;我們時常會遭遇各種數據問題&#xff0c;其中“文件或目錄損壞且無法讀取”這一狀況尤為令人頭疼。無論是個人用戶存儲在電腦硬盤、移動硬盤、U盤等設備中的重要文檔、照片、視頻&#xff0c;還是企業服務器上的關鍵業務…

數據庫如何確定或計算 LSN(日志序列號)

目錄 如何確定或計算 LSN&#xff08;日志序列號&#xff09;**一、獲取當前 LSN****二、確定日志解析的起始 LSN****三、LSN 與物理文件的映射****四、應用場景** 如何確定或計算 LSN&#xff08;日志序列號&#xff09; LSN&#xff08;Log Sequence Number&#xff09;是數…

[ctfshow web入門] web24

前置知識 isset&#xff1a;判斷這個變量是否聲明且不為NULL&#xff0c;否則返回False mt_srand&#xff1a;設置隨機數種子&#xff0c;如果不手動設置&#xff0c;那么系統會自動進行一次隨機種子的設置 mt_rand&#xff1a;生成一個隨機數&#xff0c;這個隨機數與種子有個…

習題與正則表達式

思路&#xff1a; 二分查找&#xff1a; left 1&#xff08;最小可能距離&#xff09;&#xff0c;right L&#xff08;最大可能距離&#xff09;。 每次取 mid (left right) / 2&#xff0c;判斷是否可以通過增設 ≤ K 個路標使得所有相鄰路標的距離 ≤ mid。 貪心驗證…

最小K個數

文章目錄 題意思路代碼 題意 題目鏈接 思路 代碼 class Solution { public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int> Q;for (auto &index:arr){Q.push(index);if (Q.size() > k)Q.pop();}vector<int> ans…

<tauri><rust><GUI>基于rust和tauri,將tauri程序打包為window系統可安裝的安裝包(exe、msi)

前言 本文是基于rust和tauri,由于tauri是前、后端結合的GUI框架,既可以直接生成包含前端代碼的文件,也可以在已有的前端項目上集成tauri框架,將前端頁面化為桌面GUI。 發文平臺 CSDN 環境配置 系統:windows 10平臺:visual studio code語言:rust、javascript庫:taur…

SAP系統采購信息記錄失效

問題&#xff1a;采購信息記錄失效 現象&#xff1a;最初主數據導入完成之后&#xff0c;單元測試的時采購信息記錄是有效的&#xff0c;中間經過配置的變化&#xff0c;集成測試初期發現采購信息記錄全部失效。 原因&#xff1a; 單元測試時發現采購訂單里面的條件類型…

視頻分析設備平臺EasyCVR打造汽車門店經營場景安全:AI智慧安防技術全解析

一、方案背景 某電動車企業不停爆出維權新聞&#xff0c;支持和反對的聲音此起彼伏&#xff0c;事情不斷發酵、反轉&#xff0c;每天都有新消息&#xff0c;令人目不暇接。車展、車店作為維權事件的高發場所&#xff0c;事后復盤和責任認定時&#xff0c;安防監控和視頻監控平…

ecovadis認證基本概述,ecovadis認證審核有效期

EcoVadis認證基本概述 1. 什么是EcoVadis認證&#xff1f; EcoVadis是全球領先的企業可持續發展&#xff08;ESG&#xff09;評級平臺&#xff0c;專注于評估企業在**環境&#xff08;E&#xff09;、勞工與人權&#xff08;S&#xff09;、商業道德&#xff08;L&#xff09…

初入Web網頁開發

1、網頁哪些內容 1.1 三個核心文件的作用 index.html&#xff1a;網頁的骨架&#xff0c;用HTML編寫網頁結構和內容。 script.js&#xff1a;網頁的行為&#xff0c;用JavaScript實現交互功能&#xff08;如按鈕點擊事件&#xff09;。 styles.css&#xff1a;網頁的外觀&…

CSS 符號

在 CSS 中&#xff0c;& 符號是 嵌套語法中的父選擇器引用符&#xff0c;主要用于 CSS 預處理器&#xff08;如 Sass、Less、Stylus&#xff09;和 現代 CSS 嵌套語法&#xff08;CSS Nesting&#xff09;。它代表當前選擇器的父級&#xff0c;用于簡化嵌套規則并生成更精確…

小白入門JVM、字節碼、類加載機制圖解

前提知識~ JDK 基本介紹 JDK 的全稱(Java Development Kit Java 開發工具包)JDK JRE java 的開發工具[java, javac,javadoc,javap 等]JDK 是提供給Java 開發人員使用的&#xff0c;其中包含了java 的開發工具&#xff0c;也包括了JRE。可開發、編譯、調試…… JRE 基本介紹…

consul服務注冊與發現(go)-學習筆記

參考博客 1、服務實例接口與默認實現 type ServiceInstance interface {// 獲取服務實例的唯一IDGetInstanceId() string// 獲取服務IDGetServiceId() string// 獲取服務實例的主機名或IP地址GetHost() string// 獲取服務實例的端口號GetPort() int// 判斷服務實例是否使用HT…

【AI】prompt engineering

prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定義 Prompt 工程&#xff08;Prompt Engineering&#xff09;是指在使用語言模型&#xff08;如 ChatGPT、文心一言等&#xff09;等人工智能工具時&#xff0c;設計和優化輸入提…

Python 字典和集合(常見的映射方法)

本章內容的大綱如下&#xff1a; 常見的字典方法 如何處理查找不到的鍵 標準庫中 dict 類型的變種set 和 frozenset 類型 散列表的工作原理 散列表帶來的潛在影響&#xff08;什么樣的數據類型可作為鍵、不可預知的 順序&#xff0c;等等&#xff09; 常見的映射方法 映射類型…

對抗Prompt工程:構建AI安全護欄的攻防實踐

大語言模型的開放性與自然語言交互特性使其面臨前所未有的Prompt工程攻擊威脅。本文通過分析2021-2023年間157個真實越獄案例&#xff0c;揭示語義混淆、上下文劫持、多模態組合三重攻擊路徑的技術原理&#xff0c;提出融合動態意圖拓撲分析&#xff08;DITA&#xff09;、對抗…

STL c++ list——模擬實現

結點類的模擬實現 list是一個帶頭雙向循環鏈表 因需要實現一個節點類&#xff0c;其中包含哨兵位&#xff08;用來標識位置&#xff09;&#xff0c;節點信息&#xff08;val數據&#xff0c;prev后指針&#xff0c;next后指針&#xff09; template<class T> struct …

ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、級聯查詢案例、resultMap映射

DAY21.1 Java核心基礎 ORM Object Relationship Mapping 對象關系映射 面向對象的程序到—關系型數據庫的映射 比如java – MySQL的映射 ORM框架就是實現這個映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底層就是Hiber…

【學習自用】配置文件中的配置項

server.port服務器端口&#xff0c;常被用于指定應用程序運行時所監聽的端口號spring.datasource.url用于配置數據源的數據庫連接URLspring.datasource.username用于指定連接數據庫的用戶名spring.datasource.password用于配置數據源時設置數據庫連接密碼的屬性mybatis.mapper-…

使用protobuf編譯提示無法打開包括文件: ‘absl/log/absl_log.h’: No such file or directory

問題原因 Protobuf 依賴 Abseil&#xff1a; Protobuf 3.20 版本開始依賴 Abseil&#xff0c;但你的系統未正確安裝或配置 Abseil。 頭文件路徑未包含&#xff1a; 編譯器找不到 absl/log/absl_log.h&#xff0c;可能是因為 Abseil 未正確安裝或未在項目中設置包含路徑。 …