class Solution {
private:
    bool DFS(TreeNode* root, int sum) {
        bool flag1 = false,flag2 = false;//flag表示此路两分支(左右孩子)是否被占领,一开始都未被占领
        if(!root->left&&!root->right&&sum==0)return true;//如果是叶子结点,且能量耗尽,即可占领
        if(root->left)flag1 = DFS(root->left, sum - root->left->val);//看左子树有没有被占领
        if(root->right)flag2 = DFS(root->right, sum - root->right->val);//看右子树有没有被占领
        return flag1 || flag2;//若有孩子被占领,父结点也必被占领,想象一下物理上必然要通过父结点
    }

  public:
    bool hasPathSum(TreeNode* root, int sum) {
        //把sum理解为能量,到达某点时,要消耗对应的能量。所以题目=>占领某条路用尽所有能量
        if (!root)return false;//如果根结点为空,直接不行。
        sum = sum - root->val;//首先要站在根结点上,消耗对应能量
        return DFS(root, sum);//用相应的能量走剩下的路
    }
};