剑指offer— 二叉树中和为某一值的路径
题目描述
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
思路
首先想到的就是递归
先将目标值减去
r
o
o
t
−
>
v
a
l
root->val
root−>val,然后判断当前结点
r
o
o
t
root
root 的左右子树是否为空,若为空,则说明找到一个结果,加入res
递归判断左子树,右子树,并在最后pop以免影响其他路径的值
代码
void dfs(TreeNode* root, int sum, vector<vector<int>>& res, vector<int>& v){
//先将sum减去当前结点的值
sum -= root->val;
v.push_back(root->val);
//判断目标值是否为0
if(sum == 0){
//若目标值为0并且当前结点是叶子结点,则加入到res中
if(root->left == NULL && root->right == NULL){
res.push_back(v);
}
}
//递归寻找左子树路径
if(root->left != NULL){
dfs(root->left, sum, res, v);
//查找完后记得pop出左子树的值
v.pop_back();
}
//递归寻找右子树路径
if(root->right != NULL){
dfs(root->right, sum, res, v);
//查找完后记得pop出右子树的值
v.pop_back();
}
return;
}
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> res;
if(root == NULL) return res;
vector<int> v;
dfs(root, sum, res, v);
return res;
}