TreeValueSum

题目描述[原题链接][https://www.acwing.com/problem/content/description/45/]

输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。

从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

样例

1
2
3
4
5
6
7
8
9
10
给出二叉树如下所示,并给出num=22。
5
/ \
4 6
/ / \
12 13 6
/ \ / \
9 1 5 1

输出:[[5,4,12,1],[5,6,6,5]]

算法描述

从根节点开始遍历,每次遍历一个点加上该点的值,在回溯的时候减掉节点的值,在求和的过程中,当当前节点的左右子树都为空时并且当前值与目标值相等,将该序列存入答案集合

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* 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>> ans;
vector<int> vec;
int s;
int t=0;

void dfs(TreeNode* root){
if(!root)return;
t+=root->val;
vec.push_back(root->val);
if(!root->left&&!root->right&&s==t){
ans.push_back(vec);
}
dfs(root->left);
dfs(root->right);
vec.pop_back();
t-=root->val;
return;
}

vector<vector<int>> findPath(TreeNode* root, int sum) {
if(!root)return ans;
s=sum;
dfs(root);
return ans;
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int s = 0;
List<List<Integer>> list = new ArrayList<>();
List<Integer> l = new ArrayList<>();
public List<List<Integer>> findPath(TreeNode root, int sum) {
if(root==null)return list;
dfs(root,sum);
return list;
}

void dfs(TreeNode root,int sum){
if(root==null)return ;
s+=root.val;
l.add(root.val);
if(root.left==null&&root.right==null&&s==sum){
list.add(new ArrayList<>(l));
}
dfs(root.left,sum);
dfs(root.right,sum);
s-=root.val;
l.remove(l.size()-1);
return ;
}

}