题解
相比1 这个题目要求输出和的路径
广搜方法
每搜一个节点 需要记录下 当前节点 路径和 所访问的节点列表
自己开了一个Class 记录这三个东西 然后这个class入队
class PreNode{
public:
TreeNode *treeNode;
int sum;
vector<int> list;
PreNode(TreeNode *node, int s, vector<int> ar) : treeNode(node), sum(s), list(ar) {}
};
完整广搜代码
class Solution {
public:
class PreNode{
public:
TreeNode *treeNode;
int sum;
vector<int> list;
PreNode(TreeNode *node, int s, vector<int> ar) : treeNode(node), sum(s), list(ar) {}
};
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<vector<int>> res;
if (root == nullptr) return res;
BFS(root, targetSum, res);
return res;
}
void BFS(TreeNode *node, int targetSum, vector<vector<int>> &res) {
queue<PreNode> que;
vector<int> arr;
PreNode preNode(node, node->val, arr);
que.push(preNode);
while (!que.empty()) {
PreNode pa = que.front();
que.pop();
TreeNode *t = pa.treeNode;
int sum = pa.sum;
vector<int> ar = pa.list;
ar.push_back(t->val);
if (sum == targetSum && t->left == nullptr && t->right == nullptr) {
res.push_back(ar);
continue;
}
if (t->left != nullptr) {
int sum1 = sum + t->left->val;
PreNode tn(t->left, sum1, ar);
que.push(tn);
}
if (t->right != nullptr) {
int sum2 = sum + t->right->val;
PreNode tn(t->right, sum2, ar);
que.push(tn);
}
}
}
};
深搜方法
访问到的节点 记录下 当前和 当前路径列表即可
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<vector<int>> res;
if (root == nullptr) return res;
vector<int> tmp;
DFS(root, 0, targetSum, tmp, res);
return res;
}
void DFS(TreeNode *node, int sum, int targetSum, vector<int> list, vector<vector<int>> &res) {
list.push_back(node->val);
sum += node->val;
if(sum == targetSum && node->left == nullptr && node->right == nullptr) {
res.push_back(list);
return;
}
if (node->left) {
DFS(node->left, sum, targetSum, list, res);
}
if (node->right) {
DFS(node->right, sum, targetSum, list, res);
}
return;
}
};