解24题二叉树中和为某一值的路径

二叉树中和为某一值的路径

http://www.nowcoder.com/questionTerminal/b736e784e3e34731af99065031301bca

/**
 看了几位同学的代码后,才最后写出来,但不是用了别人的,是按照自己的代码风格写的
 这道题的思路无非是树的深度优先遍历

我的思路是递归:递归方法是返回当前路径下匹配目标值的路径。
目标值 = 目标值 - 当前节点值
共有几种情况:
0,当节点为空,return
1,当目标值小于0,return
2,当目标值为0 并且 节点下无其他节点
节点下无其他节点说明是叶子节点,并且路径值的和满足了目标值,添加到结果中  并且return
3,当目标值大于0,继续递归

*/
public class Solution {
        public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {

        ArrayList<ArrayList<Integer>> result = new ArrayList<>();    
        if (root == null){
            return result;
        }


        ArrayList<Integer> path = new ArrayList<>();
        this.find(root, target, result, path);
        return result;
    }


    private void find(TreeNode root, int target, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> path) {
        // 0,当节点为空,return
        if (root == null) {
            return;
        }

        path.add(root.val);
        target -= root.val;

        // 1,当目标值小于0,return
        if(target < 0){
            return;
        }

        // 2,当目标值为0 并且 节点下无其他节点, 保存并返回
        if(target == 0 && root.left == null && root.right == null){
            result.add(path);
            return;
        }

        // 继续遍历左右节点
        // 这里new path是因为左右都会在下次递归path.add(root.val);
        this.find(root.left, target, result, new ArrayList<>(path));
        this.find(root.right, target, result, new ArrayList<>(path));
    }

    @Test
    public void test() {
        TreeNode t10 = new TreeNode(10);
        TreeNode t5 = new TreeNode(5);
        TreeNode t12 = new TreeNode(12);
        TreeNode t7 = new TreeNode(7);

        t10.left = t12;
        t10.right = t5;
        t5.right = t7;
        ArrayList<ArrayList<Integer>> res = FindPath(t10, 22);
        for (ArrayList<Integer> path : res)
            System.out.println(path);
    }

    private class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }
    }

}
全部评论
目标值小于0时不该返回,如果有后序节点还是有可能和为0的,应该把小于0和大于0统一处理继续递归。
3 回复 分享
发布于 2020-01-30 16:45
我认为答主的这个解释加代码是最清楚的
2 回复 分享
发布于 2020-02-17 01:16
如果一条路上最后的值没够,需要继续递归,path已经加了上一个数值,你对path没有进行恢复呀
1 回复 分享
发布于 2021-03-28 09:11
这个空间浪费要比前面的严重
点赞 回复 分享
发布于 2020-10-08 11:19
非常清晰
点赞 回复 分享
发布于 2020-09-29 19:44
答主写的深入浅出!赞!!!
点赞 回复 分享
发布于 2020-09-11 17:50
// 继续遍历左右节点 // 这里new path是因为左右都会在下次递归path.add(root.val); this.find(root.left, target, result, new ArrayList<>(path)); this.find(root.right, target, result, new ArrayList<>(path)); 请问这里在传递path的时候,为什么要new一下呢
点赞 回复 分享
发布于 2020-03-16 16:04

相关推荐

不愿透露姓名的神秘牛友
06-20 20:30
点赞 评论 收藏
分享
评论
22
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务