[112]. Path Sum
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
For example:
Given the below binary tree and sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.
这题可以很简单的递归。深度优先搜索。
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if (root == NULL) return false;
if (root->left == NULL && root->right == NULL) return sum == root->val;
if (root->left) {
bool l = hasPathSum(root->left, sum - root->val);
if (l) return true;
}
if (root->right) {
bool r = hasPathSum(root->right, sum - root->val);
if (r) return true;
}
return false;
}
};
[113]. 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]
]
这题要把路径都保存下来。这也是树问题里很常见的一种。维持一个二维vector, 和一个一维vector,一维vector符合条件的时候添加进二维。至于一个一维如何在递归中生成多条路径,可以在传递的时候用值传递,也就是复制多处内存。或者就是每次添加完记得删除,如下代码所示。
其实有点像backtracking。
方法一:利用之前的path sum先判断有没有路径,有路径就添加。
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> res;
if (root == NULL) return res;
vector<int> tempres;
helper2(root, sum, res, tempres);
return res;
}
bool helper1(TreeNode* root, int sum) {
if (root->left == NULL && root->right == NULL) {
if (root->val == sum) {
return true;
}
}
if (root->left && helper1(root->left, sum - root->val)) return true;
if (root->right && helper1(root->right, sum - root->val)) return true;
return false;
}
void helper2(TreeNode* root, int sum, vector<vector<int>>& res, vector<int>& tempres) {
if (helper1(root, sum)) {
tempres.push_back(root->val);
if (root->left == NULL && root->right == NULL) {
res.push_back(tempres);
tempres.pop_back();
return;
}
if (root->left) {
helper2(root->left, sum - root->val, res, tempres);
}
if (root->right) {
helper2(root->right, sum - root->val, res, tempres);
}
tempres.pop_back();
}
}
};
这里如果不想有pop_back()的操作,可以直接在函数传递的时候传递vector tempres;
方法二: 更加简洁的写法
先添加,再判断。
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> res;
if (root == NULL) return res;
vector<int> tempres;
helper(root, sum, res, tempres);
return res;
}
void helper(TreeNode* root, int sum, vector<vector<int>>& res, vector<int>& tempres) {
tempres.push_back(root->val);
if (root->left == NULL && root->right == NULL && root->val == sum) {
res.push_back(tempres);
tempres.pop_back();
return;
}
if (root->left) {
helper(root->left, sum - root->val, res, tempres);
}
if (root->right) {
helper(root->right, sum - root->val, res, tempres);
}
tempres.pop_back();
}
};