路径总和[LeetCode-112]

126 阅读1分钟

题目描述

思路分析

因为是从根节点到叶节点的,因此不用关心中间节点,只要在判断走到叶节点时,一层层减去每一层的节点的值与当前叶子
节点的值一致,则肯定满足条件。 另外,注意避免下面注释的2个坑。

代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if (!root) {
            return false;
        }
        
        // 坑1:误以为当前节点比剩余的值大即认为失败,因为中间节点正负数都有可能,并不只是一味的正数相加
        // 比如1->-2->1->-1(sum=-2)
        //if (root->val > sum) {
        //    return false;
        //}
        
        // 坑2:误认为中间某一个节点值与减去上几层之后的值一致,就认为到叶子节点就会大于sum,其实还是  
        // 没有考虑中间有正负的情况
        //if (root->val == sum && (root->left || root->right)) {
        //    return false;
        //}
        
        // 这里表明走到叶子节点,满足从根节点到叶节点,值为sum
        if (root->val == sum && !root->left && !root->right) {
            return true;
        }
        
        return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
    }
};