给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
思路:假定从根节点到当前节点的值之和为 val,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val。
1、root可能为空。
2、若当前节点就是叶子节点,那么我们直接判断 sum 是否等于 val 即可。
3、若当前节点不是叶子节点,接着递归地询问它的子节点是否能满足条件即可。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};
bool hasPathSum(TreeNode* root, int targetSum) {
if (root == nullptr)
{
return false;
}
if (root->left == nullptr && root->right == nullptr)
{
return root->val == targetSum;//左右空,直接比较
}
return hasPathSum(root->left, targetSum - root->val) || hasPathSum(root->right, targetSum - root->val);//
}
int main() {
TreeNode node1, node2, node3, node4, node5, node6, node7, node8, node9;
node1.val = 5;
node1.left = &node2;
node1.right = &node3;
node2.val = 4;
node2.left = &node4;
node2.right = nullptr;
node3.val = 8;
node3.left = &node5;
node3.right = &node6;
node4.val = 11;
node4.left = &node7;
node4.right = &node8;
node5.val = 13;
node5.left = nullptr;
node5.right = nullptr;
node6.val = 4;
node6.left = nullptr;
node6.right = &node9;
node7.val = 7;
node7.left = nullptr;
node7.right = nullptr;
node8.val = 2;
node8.left = nullptr;
node8.right = nullptr;
node9.val = 1;
node9.left = nullptr;
node9.right = nullptr;
bool res = hasPathSum(&node1, 22);
cout << boolalpha << res << endl;
return 0;
}