#Path Sum II_Week16

Path Sum II_Week16

题目:(Path Sum II) ←链接戳这里

题目说明:
Given a binary tree and a sum, find all root-to-leaf paths where each path’s sum equals the given sum.

For example:

Given the below binary tree and sum = 22,
       5
      /  \
     4   8
    /  /  \
  11  13   4
 /  \     /  \
7   2   5    1

return

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

难度: Medium

解题思路:
题意为:
给出一个和sum,和一个给定的二叉树。求从根节点到叶节点的素有路径值之和等于sum的集合。
代码思路为从根节点遍历整个树,记录和,当和等于sum时,将该路径放入结果数组中,最后返回。
题目很简单,但是一遍一遍地从根遍历下去,做了很多重复的工作,也很慢。经过学习别人的思路,携带着sum的值去遍历,而思路不是简单地加所有的节点和,相反,是每次从sum中减去该节点的值。当遇到叶子结点的值与剩下的sum值相等,又或者说sum减掉最后一个叶子节点的值为0时,能够证明这条路就是我们要的路径。
结合递归的方法,用前序访问来做,代码简单简短、思路清晰,且不需要重复多次遍历该树,就能解决问题。

代码如下:

/**
 * 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:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int> > result;
        vector<int> path;
        findPaths(root, sum, path, result);
        return result;  
    }
private:
    void findPaths(TreeNode* node, int sum, vector<int>& path, vector<vector<int> >& result) {
        if (node == NULL) {
            return;
        }
        //用前序访问的方式,先将该节点加入path,在用递归的方式分别将左右节点加入path
        path.push_back(node->val);

        if ((node->left == NULL) && (node->right == NULL) && (node->val == sum)) {
            //sum初始值为sum,每走过一个节点就减掉该节点的值
            //当一个叶子节点的值 等于 剩下的sum,说明这条路满足条件,加入数组。 
            result.push_back(path);
        }

        //递归进行前序访问 
        findPaths(node->left, sum-(node->val), path, result);
        findPaths(node->right, sum-(node->val), path, result);

        path.pop_back();
    }
};

猜你喜欢

转载自blog.csdn.net/m0_38072045/article/details/78907046
今日推荐