leetcode刷题(六)路径总和I、II、III(转)

(一)112题

题目地址:https://leetcode-cn.com/problems/path-sum/description/

题目描述:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

解决方案:

/**
 * 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==NULL){
            return false;
         }
        int t=sum-root->val;
        if(root->left==NULL&& root->right==NULL){
             return t==0 ? true :false;
        }  
        //递归调用函数,分别判断根结点的左节点和右节点
        return hasPathSum(root->left,t) || hasPathSum(root->right,t);
    }
 
};
 

备注:这里的解决方案,采用递归调用的形式,每次开始都从sum中减去到根结点的值,然后再判断当前的节点作为根结点到其左孩子和右孩子的距离与t的关系。

性能分析:


大神的写法就是厉害,这个故事告诉我们递归调用性能真的很优,下次直觉想到循环调用的时候,可以考虑一下递归调用

(二)113题

题目地址:https://leetcode-cn.com/problems/path-sum-ii/description/

题目描述:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

解决方案:

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> res;
        vector<int> out;
        worker(root,sum,out,res);
        return res;  
    }
    //递归调用,实现对节点的路径总和判断和路径记录功能
    void worker(TreeNode* node,int sum,vector<int>& out,vector<vector<int>>& res){
        if(!node) return;
        out.push_back(node->val);
        if(sum==node->val && !node->left && !node->right)
        {
            res.push_back(out);
        }
        worker(node->left,sum-node->val,out,res);
        worker(node->right,sum-node->val,out,res);
        out.pop_back();
    }
        
};
 

备注:同样使用递归调用,但由于代码较长,多写了一个函数,函数实现对二叉树中不同节点的处理进行记录。其中res为满足要求或者等待判断的当前路径,out是在新加入的路径不符合要求时,退出的节点。

性能分析:

说明:这个故事告诉我们遇到不会的问题,参考学习大神的代码没有问题,哪怕学习思路涨涨见识也好

(三)437题

题目地址:https://leetcode-cn.com/problems/path-sum-iii/description/
题目描述:

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

解决方案:

/**
 * 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:
    int pathSum(TreeNode* root, int sum) {
        int cnt = 0;
        dfs1(root, sum, cnt);
        return cnt;
        }
    //dfs用来计算二叉树中符合要求的路径的长度
    void dfs(TreeNode* root, int sum, int& cnt){
         if(root == NULL) return;
        //累计符合要求的路径个数
       if(root->val == sum) cnt++;
        dfs(root->left, sum-root->val, cnt);
        dfs(root->right, sum-root->val, cnt);
     }
    //用来遍历每个节点
    void dfs1(TreeNode* root, int sum, int& cnt){
         if(root == NULL) return;
        dfs(root, sum, cnt);
        dfs1(root->left, sum, cnt);
        dfs1(root->right, sum, cnt);
    }
 
};

分析:较II题多了一个遍历二叉树节点的函数

性能分析:

分析:看了三篇大神写的代码,发现实现相同功能的不同写法,其实可以相互借鉴一下

转自:https://blog.csdn.net/weixin_38368941/article/details/80296641


————————————————
版权声明:本文为CSDN博主「跳跳_bupt」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38368941/article/details/80296641

posted @ 2020-07-07 11:32  鸭子船长  阅读(187)  评论(0编辑  收藏  举报