给你二叉树的根节点 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);根据这个可知