Leetcode112|路径总和

发布于:2022-10-14 ⋅ 阅读:(491) ⋅ 点赞:(0)

 

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

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

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        return process(root,targetSum);
    }
    public static boolean process(TreeNode root, int targetSum){
        if(root==null){//递归停止条件
            return false;          
        }
 
        targetSum-=root.val;//目标值减去当前节点的值
       if(root.left==null&&root.right==null){//到达叶子节点
           if(targetSum==0){//目标值减到0了返回true
               return true;
           }else return false;
       }  
        //返回左边或右边是否有行的通的路径
        return process(root.left,targetSum)||process(root.right,targetSum);
       


    }
}

看到递归我们已经很熟悉了,本质是拆分成小问题返回给上层调用,最终重构栈顶现场

我们目前的栈顶是节点5判断有无满足条件的通路

节点5调用递归函数,不满足停止条件,targetSum=22-5=17,他也不是叶子节点所以拆分为小问题左右是否有通路呢?(问题未解决,留在栈顶等候现场还原)

我们来判断5的左孩子也就是4这个节点是否有targetSum为17的新通路?节点4调用递归函数,不满足停止条件,targetSum=17-4=13,他也不是叶子节点所以拆分为小问题左右是否有通路呢?(问题未解决,又一个悬而待解的问题在等待他的手下提供信息)

接下来判断4的左孩子也就是11这个节点是否有targetSum为13的新通路?节点11调用递归函数,不满足停止条件,targetSum=13-11=2,他也不是叶子节点所以拆分为小问题左右是否有通路呢?(问题未解决,等待他的手下7和2提供信息)

然后我们来到叶子节点7,他是否满足targetSum为2的新通路,节点7调用递归函数,不满足停止条件,targetSum=2-7=-5,i由于7是叶子节点所以

f(root.left==null&&root.right==null){//到达叶子节点
           if(targetSum==0){//目标值减到0了返回true
               return true;
           }else return false;所以他给上层11节点的调用返回的信息是false

所以我们返回到11对函数的调用现场、此时7已经提供了信息false,现在要2提供信息了,是否符合process(2节点,targetSum=2)的调用,明显满足返true

接下来判断4的左孩子也就是11这个节点是否有targetSum为13的新通路?节点11调用递归函数,不满足停止条件,targetSum=13-11=2,他也不是叶子节点所以拆分为小问题左右是否有通路呢?(问题未解决,等待他的手下7和2提供信息)

  return process(root.left,targetSum)||process(root.right,targetSum);

那么11对函数的调用得到了确切答案那就是false||true==true
       

我们又重构4节点的现场

我们来判断5的左孩子也就是4这个节点是否有targetSum为17的新通路?节点4调用递归函数,不满足停止条件,targetSum=17-4=13,他也不是叶子节点所以拆分为小问题左右是否有通路呢?(问题未解决,又一个悬而待解的问题在等待他的手下提供信息)

4节点的左孩子是返回的true信息,他的有孩子由于是null节点触达了递归停止条件返回false

true||false=true所以4返回给上一个现场的结论是true

我们又来到5节点也就是栈顶的现场重建

节点5调用递归函数,不满足停止条件,targetSum=22-5=17,他也不是叶子节点所以拆分为小问题左右是否有通路呢?(问题未解决,留在栈顶等候现场还原)

5节点的左节点4返回的是true所以不管8这个右节点返回的啥玩意都是true

其实8节点也可以按照这种方法捋下来

//返回左边或右边是否有行的通的路径
 return process(root.left,targetSum)||process(root.right,targetSum);根据这个可知

本文含有隐藏内容,请 开通VIP 后查看