• leetcode113.路径总和II


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

    说明: 叶子节点是指没有子节点的节点。

    示例:
    给定如下二叉树,以及目标和 sum = 22,

        5
       /
      4   8
      /    /
      11    13  4
     /         /
    7  2       5   1
    返回:

    [
    [5,4,11,2],
    [5,8,4,5]
    ]

    和112题不同的是要保存每条符合条件的路径,path实现上有两种方法,一种是作为成员变量,需要自己写回退的时机,另一种是作为参数值传递,当返回上一层时path数组自动恢复上一层的值。

    方法一(path作为成员变量):

    class Solution {
        vector<int> path;
        vector<vector<int>> res;
    public:
        vector<vector<int>> pathSum(TreeNode* root, int sum) 
        {
            if(!root) return res;
            
            findpath(root, sum);
            return res;
        }
    
        void findpath(TreeNode *root, int sum)
        {
            if(!root->left && !root->right && root->val == sum) {
                path.push_back(root->val);
                res.push_back(path);
                path.pop_back();
                return;
            }
            if(!root->left && !root->right) return;
            
            //非叶节点
            path.push_back(root->val);
            if(root->left) findpath(root->left, sum - root->val);
            if(root->right) findpath(root->right, sum - root->val);
            
            path.pop_back();
        }
    };

    方法二:

    class Solution {
        vector<vector<int>> res;
    public:
        vector<vector<int>> pathSum(TreeNode* root, int sum) 
        {
            if(!root) return res;
            vector<int> path;
            findpath(root, path, sum);
            return res;
        }
    
        void findpath(TreeNode *root, vector<int> path, int sum)
        {
            if(!root->left && !root->right && root->val == sum) {
                path.push_back(root->val);
                res.push_back(path);
                return;
            }
            if(!root->left && !root->right) return;
            //else {
                path.push_back(root->val);
                if(root->left) findpath(root->left, path, sum - root->val);
                if(root->right) findpath(root->right, path, sum - root->val);
            //}
            
        }
    };
  • 相关阅读:
    【Linux 编程】进程间通信
    毕设进行时——4.3寸在富士通ARM中实现
    spcomm使用:在编译运行时为什么总出现"unable to open include file 'spcomm.hpp'"?
    Xilinx LVDS
    Xilinx selectIO
    xilinx 原理图输入
    http消息头(转)
    用java语言将数据库中的数据表转换为xml文件的通用程序(转)
    数据字典实例
    Web Service工作原理初探
  • 原文地址:https://www.cnblogs.com/joker1937/p/13081816.html
Copyright © 2020-2023  润新知