跳转至

113. Path Sum II

Leetcode Tree Depth-first Search

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

Note: A leaf is a node with no children.

Example:

Given the below binary tree and sum = 22,

      5
     / \
    4   8
   /   / \
  11  13  4
 /  \    / \
7    2  5   1

Return:

[
   [5,4,11,2],
   [5,8,4,5]
]

分析

这道题目是112. Path Sum的加强版。Q112中只需要给出是否存在这样一条路径:路径开始于根节点,终止于叶子节点,并且路径的和为给定值。现在,更进一步,需要给出具体的路径。一种很自然的想法是,改进Q112算法,传递一个List参数,依次保存访问过的节点为路径,最后保存符合要求的路径。

使用Backtracking的思想(DFS),删除访问过的元素:

private List<List<Integer>> paths = new ArrayList<List<Integer>>();

public List<List<Integer>> pathSum(TreeNode root, int sum) {
    findPathSum(root, sum, new ArrayList<>());
    return paths;
}

private void findPathSum(TreeNode root, int sum, ArrayList<Integer> list){
    if (root == null) return;
    list.add(root.val);
    if (root.left == null && root.right == null && sum == root.val)
        paths.add(new ArrayList<>(list));
    int newSum = sum - root.val;
    findPathSum(root.right, newSum, list);
    findPathSum(root.left, newSum, list);
    list.remove(list.size() - 1);
}

为什么只删除一次呢?因为到了叶子结点的时候,它的左子节点和右子节点都是null,所以相当于删除了该叶子节点。