题目描述:
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。(https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/)
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
节点总数 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路描述:
该问题其实就是一个前序遍历流程,遍历流程为:根->左->右;
注意点:
1、通过递归执行前序遍历时,需要每次减去当前节点值,如果和为0并且该节点为叶子节点时,将该路径加入到需要返回的vector中;
2、当前路径遍历流程完成后,需要将当前节点的值从path中移除;
具体代码:
class Solution {
public:
void DFSDlr(TreeNode* root, int sum, vector<int>&path) {
if (!root) {
return;
}
int tmpNum = sum - root->val;
path.push_back(root->val);
if (tmpNum == 0 && !root->left && !root->right) {
pathres.push_back(path);
path.pop_back();
return;
}
DFSDlr(root->left, tmpNum, path);
DFSDlr(root->right, tmpNum, path);
path.pop_back();
}
vector<vector<int> > pathSum(TreeNode* root, int sum) {
if (!root) {
return pathres;
}
vector<int>path;
DFSDlr(root, sum, path);
return pathres;
}
public:
vector<vector<int> >pathres;
};