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

在这里插入图片描述
思路:
首先根据题目条件,我们要获得一条路径的要求有两个,第一必须路劲和为目标值,第二,结束节点必须是叶子节点。
并且由于给定的TreeNode并没有获得父节点的方法,所以我们在选择路径时必须把节点的值给添加到路径值中,否则无法获取到上一个节点的值。
由于是最后添加的节点,无论找到与否,我们都要进行回溯寻找吓一条合理的路线,回溯之后就要删除,所以是后进先出,我们可以用栈来保存路径。

递归方法我们可以这么去设计

第一步:获得当前的路径和,如果大于了目标值直接回溯。如果与目标值相等并且当前的节点是尾结点。那么就把这一条路径添加到结果集中,回溯寻找下一条路径。

第二步:既然第一步没有满足,那么就说明要么没有满足路径和,要么没有满足叶子节点,但这两个无论如何都需要去遍历当前的节点的孩子子节点,所以将不为空的孩子节点添加到路径中递归。这样我们就可以满足两种情况,一种是和不对,需要遍历子节点,当其是叶子节点时,也就说明孩子节点都为空,所以也不会向下遍历。此时如果是孩子节点还不满足,那么就证明当前的路径不对,需要回溯当上一个节点中。

  class Solutions{
        //路径上的值
        private LinkedList<Integer> path = new LinkedList<>();
        //结果集
        private ArrayList result = new ArrayList();
        //目标值
        int target = 0;
        public List<List<Integer>> pathSum (TreeNode root,int target){
            if(root == null) return result;
            this.target = target;
            int currentSum = 0;
            findPaths(root,currentSum);
            return  result;
        }
        private void findPaths(TreeNode root,int currerntSum){
            //先把路径的值获取 以及当前的和获取
            path.addLast(root.val);
            currerntSum += root.val;
            //判断当前的节点是否为子节点并且和满足target
            if(currerntSum == target && root.left ==null && root.right == null){
                //把当前的路劲加到结果集中
                result.add(path);
            }
            //如果不满足target,那么就遍历孩子节点
            if(root.left != null){
                findPaths(root.left,currerntSum);
            }
            if(root.right !=null){
                findPaths(root.right,currerntSum);
            }
            //回溯到上一个节点寻找新的路径
             path.removeLast();
        }
    }
原创文章 139 获赞 23 访问量 5937

猜你喜欢

转载自blog.csdn.net/weixin_44916741/article/details/104288416
今日推荐