给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false

    叶子节点 是指没有子节点的节点。

    示例 1:

    112路径总和 - 图1

    1. 输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
    2. 输出:true
    3. 解释:等于目标和的根节点到叶节点路径如上图所示。

    示例 2:

    112路径总和 - 图2

    输入:root = [1,2,3], targetSum = 5
    输出:false
    解释:树中存在两条根节点到叶子节点的路径:
    (1 --> 2): 和为 3
    (1 --> 3): 和为 4
    不存在 sum = 5 的根节点到叶子节点的路径。
    

    示例 3:

    输入:root = [], targetSum = 0
    输出:false
    解释:由于树是空的,所以不存在根节点到叶子节点的路径。
    

    提示:

    • 树中节点的数目在范围 [0, 5000]
    • -1000 <= Node.val <= 1000
    • -1000 <= targetSum <= 1000
    class Solution {
    public:
        bool tra(TreeNode* root,int num,int targetSum){
            //叶子节点找到了
            if(!root->left&&!root->right&&num==targetSum) return true;
            //叶子节点没找到
            if(!root->left&&!root->right) return false;
            //左孩子非空
            if(root->left){
                num+=root->left->val;
               if(tra(root->left,num,targetSum)) return true ;
                num-=root->left->val;
            }
            //右孩子非空
            if(root->right){
                num+=root->right->val;
               if(tra(root->right,num,targetSum)) return true ;
                num-=root->right->val;
            }
            //没有返回true就返回false
            return false;
        }
    
        bool hasPathSum(TreeNode* root, int targetSum) {
            if(root==nullptr) return false;
            int num=0;
            return tra(root,num+root->val,targetSum);
        }
    };