题目:
- 给你二叉树的根节点
root
和一个表示目标和的整数targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和targetSum
。如果存在,返回true
;否则,返回false
。叶子节点 是指没有子节点的节点。
示例:
- 输入: r o o t = [ 5 , 4 , 8 , 11 , n u l l , 13 , 4 , 7 , 2 , n u l l , n u l l , n u l l , 1 ] , t a r g e t S u m = 22 root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 root=[5,4,8,11,null,13,4,7,2,null,null,null,1],targetSum=22
- 输出: t r u e true true
解题思路一:(递归)
- 确定递归函数的参数和返回值:
bool dfs(TreeNode* cur, int cnt);
- 确定终止条件:
if(!cur->left && !cur->right && cnt == 0) return true;
if(!cur->left && !cur->right) return false;
- 确定单层递归逻辑: 先序遍历顺序为: 左 − > 中 − > 右 左->中->右 左−>中−>右
if(cur->left){
cnt -= cur->left->val;
if(dfs(cur->left, cnt)) return true;
cnt += cur->left->val;
}
if(cur->right){
cnt -= cur->right->val;
if(dfs(cur->right, cnt)) return true;
cnt += cur->right->val;
}
return false;
C++版整体代码
class Solution {
public:
bool dfs(TreeNode* cur, int cnt){
if(!cur->left && !cur->right && cnt == 0) return true;
if(!cur->left && !cur->right) return false;
if(cur->left){
cnt -= cur->left->val;
if(dfs(cur->left, cnt)) return true;
cnt += cur->left->val;
}
if(cur->right){
cnt -= cur->right->val;
if(dfs(cur->right, cnt)) return true;
cnt += cur->right->val;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == NULL) return false;
return dfs(root, targetSum - root->val);
}
};
Java版整体代码
class Solution {
public boolean dfs(TreeNode cur, int cnt){
if(cur.left == null && cur.right == null && cnt == 0) return true;
if(cur.left == null && cur.right == null) return false;
if(cur.left != null){
cnt -= cur.left.val;
if(dfs(cur.left, cnt) == true) return true;
cnt += cur.left.val;
}
if(cur.right != null){
cnt -= cur.right.val;
if(dfs(cur.right, cnt) == true) return true;
cnt += cur.right.val;
}
return false;
}
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root == null) return false;
return dfs(root, targetSum - root.val);
}
}