LC112 路径总和

Posted imagineincredible

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC112 路径总和相关的知识,希望对你有一定的参考价值。

终于自己做出来一道。。。

递归思路1

参考递归求解最大深度,构造新函数,将节点当前路径和当作额外参数传入
这个题比较特殊的地方在于,必须是叶子节点所在的路径才有效,因此在return true的条件中加入了left right均为`nullptr
返回时使用||不影响某个分支上的正确结果

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        return depth(root, 0, sum);
    }
    bool depth(TreeNode* root, int res, int sum){
        if(root == nullptr)
            return false;
        //这两行注释也可以通过,不知道为什么,其实少了返回条件,猜测是因为函数没有返回值,而bool默认值为false
        //if(res + root->val == sum && root->left == nullptr && root->right == nullptr)
            //return true;  
        if(root->left == nullptr && root->right == nullptr)
            return (res + root->val) == sum;  
        bool lres = depth(root->left, res + root->val, sum);
        bool rres = depth(root->right, res + root->val, sum);
        return lres || rres;
    }
};

递归思路2

官方题解中采用的方法很巧妙,通过剩余值来代替上述方法中的路径和,直接在函数中递归即可

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if(root == nullptr)
            return false;
        if(root->left == nullptr && root->right == nullptr)
            return sum == root->val;
        return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
    }
};

非递归思路 广度优先搜索

使用两个队列,分别存储节点以及当前节点路径和,节点的子节点入队列时,当前节点的路径和与子节点的值和相加入队列

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        if(root == nullptr)
            return false;
        queue<TreeNode*> nodes;
        queue<int> sums;
        nodes.push(root);
        sums.push(root->val);
        while(!nodes.empty()){
            TreeNode* nowNode = nodes.front();
            int nowSum = sums.front();
            if(nowNode->left == nullptr && nowNode->right == nullptr && nowSum == sum)
                return true;
            if(nowNode->left != nullptr){
                nodes.push(nowNode->left);
                sums.push(nowSum + nowNode->left->val);
            }
            if(nowNode->right != nullptr){
                nodes.push(nowNode->right);
                sums.push(nowSum + nowNode->right->val);
            }
            nodes.pop();
            sums.pop();
        }
        return false;
    }
};


以上是关于LC112 路径总和的主要内容,如果未能解决你的问题,请参考以下文章

LC112 路径总和

LC112 路径总和

LC112 路径总和

[LC] 112题 路径总和(在二叉树里判断是否有哪条路径之和等于某个值)

先走一步啦(112路径总和),对解题代码的深入思考

LeetCode第112题—路径总和—Python实现