二叉树找 路径

151 阅读1分钟

给定一个二叉树和一个目标值,找出二叉树中所有从根节点到叶子节点路径的和等于目标值的路径。注意,叶子节点指的是没有子节点的节点。

例如,给定以下二叉树和目标值 22:

  5
 / \
4   8

/ /
11 13 4 / \ /
7 2 5 1 满足要求的路径为:

[ [5,4,11,2], [5,8,4,5] ] 要求编写一个函数,接收一个二叉树的根节点和一个目标值,返回所有满足要求的路径。

请注意,这道题需要您掌握深度优先搜索(DFS)的算法思想。

class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        dfs(root, targetSum, 0, path, result);
        return result;
    }

    private void dfs(TreeNode root, int targetSum, int sum, List<Integer> path, List<List<Integer>> result) {
        if (root == null) {
            return;
        }

        sum += root.val;
        path.add(root.val);

        if (root.left == null && root.right == null) {
            if (sum == targetSum) {
                result.add(new ArrayList<>(path));
            }
        } else {
            dfs(root.left, targetSum, sum, path, result);
            dfs(root.right, targetSum, sum, path, result);
        }

        path.remove(path.size() - 1);
    }
}
在这个实现中,我们使用了深度优先搜索的算法思想,通过递归遍历二叉树,并记录当前路径上的节点值和路径和。当遇到叶子节点时,如果路径和等于目标值,则将当前路径保存下来。

具体实现中,我们定义了一个 dfs() 方法,在其中对每个节点进行遍历,如果当前节点为叶子节点并且路径和等于目标值,则将当前路径保存到结果列表中。如果当前节点不是叶子节点,则继续遍历其左右子树。在递归遍历左右子树之前,需要将当前节点的值加入路径列表中,并在遍历完成后将其从路径列表中移除。