一、題目
力扣原題: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回溯到上一層時,需要將路徑回退一格;