/*
路径总和 II:
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
*/
#include <iostream>
#include <climits>
#include<vector>
// 包含 LONG_MIN 和 LONG_MAX
using namespace std;
typedef struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
}TreeNode;
void solve(TreeNode* Tree, int target, int sum, vector<vector<int>>& m, vector<int>& co) {
if (!Tree) return;
// 将当前节点值加入到路径中
co.push_back(Tree->val);
sum += Tree->val;
// 到达叶子节点且路径和等于目标值时,将当前路径加入到结果中
if (!Tree->left && !Tree->right && sum == target) {
m.push_back(co);
}
// 递归处理左子树和右子树
solve(Tree->left, target, sum, m, co);
solve(Tree->right, target, sum, m, co);
// 回溯:将当前节点值从路径中移除
co.pop_back();
}
vector<vector<int>> pathSum(TreeNode* Tree, int target) {
vector<vector<int>> m;
vector<int> co;
solve(Tree, target, 0, m, co);
return m;
}
int main() {
// 测试代码
TreeNode* root = new TreeNode(5);
root->left = new TreeNode(4);
root->right = new TreeNode(8);
root->left->left = new TreeNode(11);
root->left->left->left = new TreeNode(7);
root->left->left->right = new TreeNode(2);
root->right->left = new TreeNode(13);
root->right->right = new TreeNode(4);
root->right->right->left = new TreeNode(5);
root->right->right->right = new TreeNode(1);
vector<vector<int>> result = pathSum(root, 22);
cout << "Paths with sum 22:" << endl;
for (const auto& path : result) {
for (int val : path) {
cout << val << " ";
}
cout << endl;
}
return 0;
}