新手算法学习之路----二叉树(二叉树的路径和)

题目:  给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径。

一个有效的路径,指的是从根节点到叶节点的路径。

代码加思路

public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) {
         List<List<Integer>> Result = new ArrayList<>();
         List<Integer> path= new ArrayList<Integer>();
         if(root == null){
             return Result;
         }
         path.add(root.val);
         helper(Result, path,root.val,target,root);  //这里的根节点的值我一开始忘记加了,这是我的一个错误
         return Result;
    }
    private void helper(List<List<Integer>>Result, List<Integer>path, int sum, int target, TreeNode root){
        if(root.left == null&&root.right == null){//判断已到达了叶子节点,如果到达了叶子节点的话还没有和sum相等的话那就放弃这个path数组
            if(sum == target){
                Result.add(new ArrayList<Integer>(path));
            }
            return;
        }
        if(root.left!= null){  //左子树
            path.add(root.left.val);
            helper(Result,path, sum+root.left.val, target,root.left);
            path.remove(path.size()-1);  //这个remove的作用是,如果找到了sum==target的路径的话,由于每一在遍历左子树的时候就已经把每一个节点add到path数组里面了,在最后一个节点那里也已经将path值添加到了Result值里面了,所以要将path清空留个下一个右节点。同时要想合理的删除path里面的内荣最好的办法就是从后往前删,这是remove的一个弊端。
        }
        if(root.right != null){
            path.add(root.right.val);
            helper(Result,path,sum+root.right.val, target, root.right);
            path.remove(path.size()-1);
        }
    }

 

posted @ 2017-07-21 23:44  JunLiu37  阅读(1201)  评论(0编辑  收藏  举报