Path Sum II_Week16
题目说明:
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();
}
};