劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)

来源:https://www.cnblogs.com/CrazyPixel/archive/2023/02/19/17134359.html
-Advertisement-
Play Games

leetcode《圖解數據結構》劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)的解題思路和java代碼,並附上java中常用數據結構的功能函數。 ...


目錄

1. 題目

給你二叉樹的根節點 root 和一個整數目標和 targetSum ,找出所有 從根節點到葉子節點 路徑總和等於給定目標和的路徑。

葉子節點 是指沒有子節點的節點。

示例 1:
alt
輸入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
輸出:[[5,4,11,2],[5,8,4,5]]

示例 2:
alt
輸入:root = [1,2,3], targetSum = 5
輸出:[]

示例 3:
輸入:root = [1,2], targetSum = 0
輸出:[]

提示:

樹中節點總數在範圍 [0, 5000] 內
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000

作者:Krahets
鏈接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/5dy6pt/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

2. 解題思路

首先能夠想到的是用二叉樹遞歸的方式來查找路徑,每次遞歸都需要修改target的值,在這種做法中有一個問題:如何設置返回值,從而返迴路徑列表,且在程式中如何修改路徑列表?

在官方題解中,在類的定義中適用resultpath兩個公共變數,可以讓不同的函數均基於這塊公共區域加以修改。

遍歷使用的是先序遍歷。

  • 如果需要繼續遍歷,將當前結點放入path路徑中;
  • 如果已經遍歷到葉子結點,且路徑之和等於target的值,將當前的路徑整體放入結果列表中;
  • 當某一層遍歷結束之後,需要將當前結點彈出路徑列表中,實現二叉遍歷

需要註意的是,由於list.add()使用的是淺拷貝,如果每次將path添加到結果列表中使用的是result.add(path),這樣寫忽略了list.add()是進行淺拷貝的,即每個路徑結果path都指向同一個記憶體地址,後續在此記憶體地址上的操作將會改變前期的結果。最終出現[[x,y,z][x,y,z][x,y,z]]三個子列表相同的情況。因此,每次寫入result列表應該新建一個path對象。

3. 數據類型功能函數總結

//LinkedList
LinkedList<E> listname=new LinkedList<E>();//初始化
LinkedList<E> listname=new LinkedList<E>(oldlist);//將oldlist的元素複製一份給listname,且是深拷貝
LinkedList.add(elment);//在鏈表尾部添加元素
LinkedList.removeFirst();//取出鏈表頭部元素

4. java代碼

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 // 考慮迭代,左右子樹再找某個目標值的路徑。
class Solution {
    LinkedList<List<Integer>> result=new LinkedList<List<Integer>>();
    LinkedList<Integer> path=new LinkedList<Integer>();
    public List<List<Integer>> pathSum(TreeNode root, int target) {
        recur(root,target);
        return result;
    }
    void recur(TreeNode root, int target) {
        if(root!=null){
            path.add(root.val);
            target-=root.val;
            if(target==0&&root.left==null&&root.right==null){//遍歷到葉節點且目標值正好等於路徑之和
                LinkedList<Integer> path_temp=new LinkedList<Integer>(path);
                result.add(path_temp);
            }
            recur(root.left,target);
            recur(root.right,target);
            path.removeLast();//回退時將當前元素出棧
        }
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 定義 1.排列 排列,一般地,從n個不同元素中取出m(m≤n)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列。特別地,當m=n時,這個排列被稱作全排列。 用Αnm表示“從n個元素里取m個元素,排成一排的方案數”,也就是Αnm=n!/(n-m)! ,將它稱為排列數。 註:n!即 ...
  • 這次設計一個DDS信號發生器。該設計的特點有: 雙通道的DA輸出,可以調節頻率、相位、和波形(正弦波、方波、三角波)。 擁有相位重置的功能,能夠同時重置兩個輸出波形的相位。 本次採用的是小梅哥的ACM2108模塊。該模塊有兩個通道的ADC和兩個通道的DAC。 本次設計的前置是DDS基本模塊,具體可點 ...
  • Requests 是一個 Python 的一個第三方庫,通過發送 HTTP 請求獲取響應數據,一般應用於編寫網路爬蟲和介面測試等。 相比 urllib 庫,它語法簡單,更容易上手。 官方中文文檔地址:Requests: 讓 HTTP 服務人類 離線文檔下載地址:Requests document d ...
  • 背景 golang可以獲取命令執行的輸出結果,但要執行完才能夠獲取。 如果執行的命令是ssh,我們要實時獲取,並執行相應的操作呢? 示例 func main() { user := "root" host := "172.16.116.133" //獲取執行命令 cmd := exec.Comman ...
  • IDEA如何使用Maven不通過模板創建javaWeb項目 1.創建項目 進入IDEA,點擊“項目”>“新建項目”,填寫項目信息,最後點擊“創建”。 點擊“創建”後,自動進入新創建的項目。 2.給項目配置Web框架 點擊 “文件”>“項目結構”,自動跳轉到項目結構。 點擊 “模塊” > “+” > ...
  • 給大家推薦一個比Redis性能更強的數據:KeyDB KeyDB是Redis的高性能分支,側重於多線程、記憶體效率和高吞吐量。除了性能改進外,KeyDB還提供主動複製、快閃記憶體和子密鑰過期等功能。KeyDB具有MVCC架構,允許您在不阻塞資料庫和降低性能的情況下執行密鑰和掃描等查詢。 KeyDB與Redi ...
  • ​ 函數的調用、定義、參數 ​編輯 #######命名關鍵字參數沒完 abs()函數:絕對值 >>> abs(100) 100 >>> abs(-20) 20 max()函數:接收任意多個參數,並返回最大的那個 >>> max(1, 2) 2 >>> max(2, 3, 1, -5) 3 數據類型轉 ...
  • 介紹 棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...