路径总和
- 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
解题思路
递归思路:
- 每次访问一个节点时,检查当前节点是否为叶子节点, 如果是叶子节点且路径上所有节点的值之和等于 targetSum,返回 true。
- 否则,递归检查该节点的左右子树。
递归终止条件:
- 如果当前节点为 null,返回 false。
- 如果当前节点为叶子节点,且当前节点的值等于 targetSum,返回 true。
递归过程:
- 在递归调用左右子树时,减去当前节点的值,从而更新 targetSum。
Java实现
ublic class PathSum {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public boolean hasPathSum(TreeNode root, int targetSum) {
if (root == null) {
return false;
}
// 如果是叶子节点,检查是否路径和等于 targetSum
if (root.left == null && root.right == null) {
return root.val == targetSum;
}
// 递归检查左右子树
return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val);
}
public static void main(String[] args) {
PathSum pathSum = new PathSum();
// 构建示例二叉树
TreeNode root = new TreeNode(5);
root.left = new TreeNode(4);
root.right = new TreeNode(8);
root.left.left = new TreeNode(11);
root.left.left.left = new TreeNode(7);
root.left.left.right = new TreeNode(2);
root.right.left = new TreeNode(13);
root.right.right = new TreeNode(4);
root.right.right.right = new TreeNode(1);
int targetSum = 22;
// 检查是否存在路径和等于 targetSum
boolean result = pathSum.hasPathSum(root, targetSum);
System.out.println("Has path sum " + targetSum + ": " + result);
}
}
时间空间复杂度
- 时间复杂度:O(n),其中 n 是二叉树中的节点数。每个节点仅被访问一次。
- 空间复杂度:O(h),其中 h 是二叉树的高度。最坏情况下,递归栈的深度等于二叉树的高度。