一、思路
这道题考查的是对回溯的掌握。由于我们找到合法的path后就应该及时返回结果,否则继续进行遍历。
二、代码
class Solution {
public:
bool pathSum(TreeNode* root, int sum, int targetSum){
if(root->left==nullptr && root->right==nullptr){
if(sum == targetSum) {
return true;
}
else return false;
}
if(root->left){
if(pathSum(root->left, sum+root->left->val, targetSum)) return true;
}
if(root->right){
if(pathSum(root->right, sum+root->right->val, targetSum)) return true;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == nullptr) return false;
return pathSum(root, root->val, targetSum);
}
};
还有另一种写法,但是要遍历整棵树。
class Solution {
public:
bool flag = false;
void pathSum(TreeNode* root, int sum, int targetSum){
if(root->left==nullptr && root->right==nullptr){
if(sum == targetSum) {
flag = true;
}
return ;
}
if(root->left){
pathSum(root->left, sum+root->left->val, targetSum);
}
if(root->right){
pathSum(root->right, sum+root->right->val, targetSum);
}
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root == nullptr) return false;
pathSum(root, root->val, targetSum);
return flag;
}
};
这也是基本的回溯模版。
在考虑有返回值的情况下,要思考清楚什么情况下返回什么。