思路分析:
-
结构定义: 定义了树节点结构
TreeNode
,包含一个整数值val
以及左右子节点的指针。 -
成员变量:
result
用于存储所有满足条件的路径,path
用于暂时存储当前路径的节点值。 -
深度优先搜索(DFS):
dfs
函数是深度优先搜索的核心。在叶子节点处,判断当前路径是否满足条件,满足则将该路径加入result
。递归遍历左右子树,将子节点的值加入路径,递归完成后回溯,将当前节点值移出路径。 -
主函数:
pathSum
函数是主要的函数入口。若树为空,直接返回空结果;否则,将根节点值加入初始路径,并调用dfs
函数进行深度优先搜索。 -
返回结果: 最终返回存储所有满足条件的路径的
result
。
该代码基于深度优先搜索的思想,通过递归遍历树的每一条路径,并判断是否满足条件,从而找到所有路径和等于目标值的路径。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
vector<vector<int>> result; // 用于存储所有满足条件的路径
vector<int> path; // 用于暂时存储当前路径的节点值
// 深度优先搜索函数,递归遍历树的每一条路径
void dfs(TreeNode *root, int targetSum, int nowsum) {
// 到达叶子节点时,判断当前路径是否满足条件
if (root->left == nullptr && root->right == nullptr) {
if (targetSum == nowsum) {
result.push_back(path);
}
return; // 到达叶子节点,结束当前路径的搜索
}
// 递归遍历左子树
if (root->left) {
path.push_back(root->left->val); // 将左子节点值加入路径
dfs(root->left, targetSum, nowsum + root->left->val); // 递归搜索左子树
path.pop_back(); // 回溯,将当前左子节点值移出路径
}
// 递归遍历右子树
if (root->right) {
path.push_back(root->right->val); // 将右子节点值加入路径
dfs(root->right, targetSum, nowsum + root->right->val); // 递归搜索右子树
path.pop_back(); // 回溯,将当前右子节点值移出路径
}
}
public:
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if (root == nullptr)
return result; // 树为空,返回空结果
path.push_back(root->val); // 将根节点值加入初始路径
dfs(root, targetSum, root->val); // 从根节点开始深度优先搜索
return result; // 返回所有满足条件的路径
}
};