Skip to content

Commit d185e01

Browse files
committed
113 Path Sum II
1 parent e2c4ffc commit d185e01

File tree

3 files changed

+120
-0
lines changed

3 files changed

+120
-0
lines changed

algorithms/PathSum/README.md

+4
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@ bool hasPathSum(struct TreeNode *root, int sum) {
3636
return true;
3737
}
3838
```
39+
40+
## 扩展
41+
42+
见[Path Sum II](../PathSum2).

algorithms/PathSum2/README.md

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
## Path Sum II
2+
3+
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
4+
5+
For example:
6+
Given the below binary tree and `sum = 22`,
7+
```
8+
5
9+
/ \
10+
4 8
11+
/ / \
12+
11 13 4
13+
/ \ / \
14+
7 2 5 1
15+
```
16+
return
17+
```
18+
[
19+
[5,4,11,2],
20+
[5,8,4,5]
21+
]
22+
```
23+
24+
这题和[Path Sum I](../PathSum)一样使用前序遍历的方法,不过遍历的同时需要保存当前的值。
25+
26+
设当前访问的节点为p,已访问的节点保存于cur, 结果集result, 目标值sum
27+
28+
* 若p是空节点,直接返回
29+
* p值压入cur,`sum -= p->val`
30+
* 若p是叶子节点,并且`sum == 0`, 把cur压入result结果集中
31+
* 否则p不是叶子节点,递归探测左孩子、右孩子.
32+
33+
## Code
34+
```cpp
35+
void pathSum(vector<vector<int>> &result, vector<int> cur, TreeNode *root, int sum) {
36+
if (root == NULL)
37+
return;
38+
cur.push_back(root->val);
39+
sum -= root->val;
40+
if (isLeft(root) && sum == 0) {
41+
result.push_back(cur);
42+
return;
43+
}
44+
pathSum(result, cur, root->left, sum);
45+
pathSum(result, cur, root->right, sum);
46+
}
47+
```

algorithms/PathSum2/solve.cpp

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <vector>
2+
#include <iostream>
3+
#include <algorithm>
4+
using namespace std;
5+
struct TreeNode {
6+
int val;
7+
TreeNode *left;
8+
TreeNode *right;
9+
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
10+
};
11+
class Solution {
12+
public:
13+
vector<vector<int> > pathSum(TreeNode *root, int sum) {
14+
vector<vector<int>> result;
15+
vector<int> t;
16+
pathSum(result, t, root, sum);
17+
return result;
18+
}
19+
private:
20+
void pathSum(vector<vector<int>> &result, vector<int> cur, TreeNode *root, int sum) {
21+
if (root == NULL)
22+
return;
23+
cur.push_back(root->val);
24+
sum -= root->val;
25+
if (isLeft(root) && sum == 0) {
26+
result.push_back(cur);
27+
return;
28+
}
29+
pathSum(result, cur, root->left, sum);
30+
pathSum(result, cur, root->right, sum);
31+
}
32+
bool isLeft(TreeNode *p) {
33+
if (p == nullptr)
34+
return false;
35+
return p->left == nullptr && p->right == nullptr;
36+
}
37+
};
38+
TreeNode *mk_node(int val)
39+
{
40+
TreeNode *p = new TreeNode(val);
41+
return p;
42+
}
43+
void mk_child(TreeNode *root, TreeNode *left, TreeNode *right)
44+
{
45+
root->left = left;
46+
root->right = right;
47+
}
48+
void mk_child(TreeNode *root, int left, int right)
49+
{
50+
mk_child(root, mk_node(left), mk_node(right));
51+
}
52+
int main(int argc, char **argv)
53+
{
54+
Solution solution;
55+
TreeNode *root = mk_node(5);
56+
mk_child(root, 4, 8);
57+
TreeNode *left = root->left;
58+
TreeNode *right = root->right;
59+
mk_child(left, mk_node(11), nullptr);
60+
mk_child(left->left, 7, 2);
61+
mk_child(right, 13, 4);
62+
mk_child(right->right, 5, 1);
63+
auto result = solution.pathSum(root, 22);
64+
cout << "size: " << result.size() << endl;
65+
for (auto v : result) {
66+
for_each(v.begin(), v.end(), [](int i){cout << i << " ";});
67+
cout << endl;
68+
}
69+
}

0 commit comments

Comments
 (0)