LintCode 376. Binary Tree Path Sum

给定一个二叉树,找出所有路径中各节点相加总和等于给定目标值的路径。
一个有效的路径,指的是从根节点到叶节点的路径。

给定一个二叉树,和目标值 = 5

    1 
   / \ 
  2   4 
 / \
2   3

返回

[[1, 2, 2], [1, 4]]

DFS递归求解,注意将符合条件的path加入结果集时要重新new一个ArrayList深度克隆path,关于java中的深度克隆和浅度克隆,这里有一篇比较详细的文章

可执行的完整代码如下(包括构造测试集):

/**
 * Created by wangshiyi on 17/6/10.
 *
 */

public class BinaryTreePathSum {

    public static void main(String[] args) {
        //   构造测试集
        //       1
        //      / \
        //     2   4
        //    / \
        //   2   3
        TreeNode leaf2 = new TreeNode(2);
        TreeNode leaf3 = new TreeNode(3);
        TreeNode leaf4 = new TreeNode(4);
        TreeNode node2 = new TreeNode(2, leaf2, leaf3);
        TreeNode root1 = new TreeNode(1, node2, leaf4);

        System.out.println(binaryTreePathSum(root1, 5));
    }

    public static List<List<Integer>> binaryTreePathSum(TreeNode root, int target) {
        List<List<Integer>> result = new ArrayList<>();
        if (null == root) {
            return result;
        }
        Stack<Integer> path = new Stack<>();
        binaryTreePathSum(result, path, root, 0, target);
        return result;
    }

    public static void binaryTreePathSum(List<List<Integer>> result, Stack<Integer> path,
                                         TreeNode root, int sum, int target) {
        sum += root.val;
        path.push(root.val);
        if (sum == target && null == root.left && null == root.right) {
            List<Integer> list = new ArrayList<>(path); // 重新new一个ArrayList,深度克隆path
            result.add(list);
            path.pop();
            return;
        }
        if (root.left != null) {
            binaryTreePathSum(result, path, root.left, sum, target);
        }
        if (root.right != null) {
            binaryTreePathSum(result, path, root.right, sum, target);
        }
        path.pop();
    }
}

class TreeNode {

    int val;
    TreeNode left, right;

    public TreeNode(int val) {
        this.val = val;
        this.left = this.right = null;
    }

    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容