基本问题:路径总和 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if (root == nullptr)
return false;
if (root->left&&root->right)
return hasPathSum(root->left, sum - root->val) + hasPathSum(root->right, sum - root->val);
else if (root->left)
return hasPathSum(root->left, sum - root->val);
else if (root->right)
return hasPathSum(root->right, sum - root->val);
else return (root->val == sum);
}
};
升级问题1:路径总和Ⅱ 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> ans;
vector<vector<int>> leftPath,rightPath;
if (root == NULL)
return ans;
if (root->left == NULL && root->right == NULL)
{
if (root->val == sum)
ans.push_back({ {root->val} });
}
if (root->left)
{
leftPath = pathSum(root->left, sum - root->val);
}
if (!leftPath.empty())
{
for (auto iter = leftPath.begin(); iter != leftPath.end(); ++iter)
{
(*iter).insert((*iter).begin(), root->val);
ans.push_back(*iter);
}
}
if (root->right)
{
rightPath = pathSum(root->right, sum - root->val);
}
if (!rightPath.empty())
{
for (auto iter = rightPath.begin(); iter != rightPath.end(); ++iter)
{
(*iter).insert((*iter).begin(), root->val);
ans.push_back(*iter);
}
}
return ans;
}
};
另一种更好的写法:
class Solution {
public:
void DFS(TreeNode* root, vector<int>& t, int sum)
{
if (root == NULL)
return;
t.push_back(root->val);
if (root->val == sum && root->left == NULL && root->right == NULL)
{
ans.push_back(t);
}
DFS(root->left, t, sum - root->val);
DFS(root->right, t, sum - root->val);
t.pop_back();
}
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<int> t;
DFS(root, t, sum);
return ans;
}
private:
vector<vector<int>> ans;
};
升级问题2:路径总和Ⅲ:找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
class Solution {
public:
void DFS(TreeNode* root, int sum)
{
if (root == NULL)
return;
if (root->val == sum)
{
++ans;
}
DFS(root->left, sum - root->val);
DFS(root->right, sum - root->val);
}
void findAllPath(TreeNode* root, int sum)
{
DFS(root, sum);
if (root)
{
findAllPath(root->left, sum);
findAllPath(root->right, sum);
}
}
int pathSum(TreeNode* root, int sum)
{
findAllPath(root, sum);
return ans;
}
private:
int ans=0;
};