路径总和 II
题目描述:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
递归与回溯
二叉树是一个递归定义,也就是说二叉树的左子树也是一个二叉树,右子树也同理。
可以将其不断分解,直到叶子节点
这道题运用递归可以遍历到叶子节点,如果符合题意则压入结果中,然后回溯直到遍历每个叶子节点
if (root->left)
{
targetSum -= root->left->val;
path.push_back(root->left->val);
getPath(root->left, targetSum);
targetSum += root->left->val;
path.pop_back();
}
if (root->right)
{
targetSum -= root->right->val;
path.push_back(root->right->val);
getPath(root->right, targetSum);
targetSum += root->right->val;
path.pop_back();
}
此道题采用先序遍历,确定单次递归逻辑
class Solution
{
public:
vector<vector<int>> res;
vector<int> path;
void getPath(TreeNode* root, int targetSum)
{
if (!root) return;
if (root->left == nullptr && root->right == nullptr)
{
if (targetSum == 0)
res.push_back(path);
return;
}
if (root->left)
{
targetSum -= root->left->val;
path.push_back(root->left->val);
getPath(root->left, targetSum);
targetSum += root->left->val;
path.pop_back();
}
if (root->right)
{
targetSum -= root->right->val;
path.push_back(root->right->val);
getPath(root->right, targetSum);
targetSum += root->right->val;
path.pop_back();
}
return;
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum)
{
res.clear();
path.clear();
if (root == NULL) return res;
path.push_back(root->val); // 把根节点放进路径
getPath(root, targetSum - root->val);
return res;
}
};