一、算法思想:递归+回溯
1. 递归(DFS 深度优先搜索)
核心思想:
- 从根开始,每往下走一层,就从
targetSum中减去当前节点的值。 - 到达叶子节点时,检查剩余的
targetSum是否等于 0。 - 如果等于 0,说明找到了一条满足条件的路径。
2. 递推方式(减法思想)
我们不维护路径和,而是不断 缩小目标值:
newTarget = targetSum - root.val
然后递归地在子树中查找是否存在和为 newTarget 的路径。
口诀: "递归减目标,叶节点判零,左右任一真,整体就为真。"
二、解题模板
java
public boolean hasPathSum(TreeNode root, int targetSum) {
// 空节点,无路径
if (root == null) {
return false;
}
// 到达叶子节点,判断剩余目标是否等于当前节点值
if (root.left == null && root.right == null) {
return targetSum == root.val;
}
// 递归检查左子树或右子树
return hasPathSum(root.left, targetSum - root.val) ||
hasPathSum(root.right, targetSum - root.val);
}
三、典型例题
java
/**
* 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) {
if(root==null){
return false;
}
targetSum-=root.val;
if(root.left==null && root.right==null){
return targetSum==0;
}
if(root.left!=null){
boolean left = hasPathSum(root.left,targetSum);
if(left){
return true;
}
}
if(root.right!=null){
boolean right = hasPathSum(root.right,targetSum);
if(right){
return true;
}
}
return false;
}
}