112. 路径总和/257. 二叉树的所有路径

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。

叶子节点 是指没有子节点的节点。

 

示例 1:

 

 


输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true

   public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null){
            return false;
        }
        if(root.left==null && root.right==null){
           return targetSum-root.val==0;
        }
        return hasPathSum(root.left,targetSum-root.val) || hasPathSum(root.right,targetSum-root.val);
    }

  

 

257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

 
示例 1:


输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
示例 2:

输入:root = [1]
输出:["1"]

public List<String> binaryTreePaths(TreeNode root) {
        List<String> res=new ArrayList<>();
        process(root,res,"");
        return res;
    }

    private void process(TreeNode root,List<String> res,String path){
        if(root==null){
            return;
        }
        path+=root.val;
        if(root.left==null && root.right==null){
            res.add(path);
            return;
        }    
        process(root.left,res,path+"->");
        process(root.right,res,path+"->");
    }

  

 

437. 路径总和 III

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例 1:

输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。

java 双重递归 思路:首先先序递归遍历每个节点,再以每个节点作为起始点递归寻找满足条件的路径。

class Solution {
    int pathNumber;
    public int pathSum(TreeNode root, int targetSum) {
        if(root==null){
            return 0;
        }
        sum(root,targetSum);
        pathSum(root.left,targetSum);
        pathSum(root.right,targetSum);
        return pathNumber;

    }

    private void sum(TreeNode node,int targetSum){
        if(node==null){
            return;
        }
    
        if(node.val==targetSum){
            pathNumber++;
        }

        sum(node.left,targetSum-node.val);
        sum(node.right,targetSum-node.val);

    }
}

  

113. 路径总和 II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

 

示例 1:

 

 


输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        if(root==null){
            return new ArrayList<>();
        }
        List<Integer> path=new ArrayList<>();
        process(root,targetSum,path);
        return res;
    }

    private void process(TreeNode node,int targetSum,List<Integer> path){
        //node==null
        if(node==null){
            if(targetSum==0){
                res.add(path);
            }
            return;
        }
        //重新定义path
        List<Integer> pathPick=new ArrayList<>(path);
        pathPick.add(node.val);
        //当前是叶子节点了
        if(node.left==null && node.right==null){
            if(targetSum==node.val){
                res.add(pathPick);
            }
            return;
        }
        //往左尝试
        if(node.left!=null){
            process(node.left,targetSum-node.val,pathPick);
        }
        //往右尝试
        if(node.right!=null){
            process(node.right,targetSum-node.val,pathPick);
        }

    }
}

  

 

posted @ 2021-10-08 12:36  sherry001  阅读(47)  评论(0编辑  收藏  举报