【二叉樹】路徑總和(含路徑)

一、題目

力扣原題:https://leetcode-cn.com/problems/path-sum-ii/

【二叉樹】路徑總和:https://blog.csdn.net/sinat_34596644/article/details/106109952

二、DFS+回溯

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    private int target;

    private List<List<Integer>> result;

    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        if (null == root) {
            return new ArrayList<>();
        }

        this.target = sum;
        this.result = new ArrayList<>();
        dfs(root, 0, new ArrayList<Integer>());
        return this.result;
    }

    private void dfs(TreeNode root, int cur, List<Integer> record) {
        if (null == root) {
            return;
        }

        // 記錄當前狀態
        cur = cur + root.val;
        record.add(root.val);

        // 1、當前路徑和 = 目標路徑和
        // 2、當前節點爲葉子節點
        if (cur == this.target && null == root.left && null == root.right) {
            List<Integer> subResult = new ArrayList<>(record);
            this.result.add(subResult);
            return;
        }

        // 遞歸左子樹
        if (null != root.left) {
            dfs(root.left, cur, record);
            record.remove(record.size() - 1);
        }

        // 遞歸右子樹
        if (null != root.right) {
            dfs(root.right, cur, record);
            record.remove(record.size() - 1);
        }
    }
}
  • 基本思路:相比於不記錄路徑的路徑總和,需要多一個List保存結果。
  • 時間複雜度:O(n)。DFS深度優先遍歷,每個節點訪問一次。
  • 空間複雜度:O(log(n))。最壞情況是二叉樹退化爲鏈表,此時時間複雜度爲O(n),最好情況是最小的樹深度O(log(n))。

三、總結

  • 由於JAVA的引用傳遞,當找到目標節點時,需要基於當前的記錄重新構造一個List,即List<Integer> subResult = new ArrayList<>(record);;
  • 當DFS回溯到上一層時,需要將路徑回退一格;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章