题目描述
这是112的题目描述,112是要判断是否有一条路径节点值的和等于目标值,而113是要找到这条路径并且输出。
因此题目也比较明朗,还是用递归的方法做同时记得回溯
第一步:确定函数的返回值以及参数,root必须传入,同时传入剩余值即目标值减节点值之后的剩余值,返回值类型bool
第二步:确定终止条件,递归到叶子节点且remin为0即找到路径,
第三步:单层逻辑,代码里说
leetcode 112 .代码实现
class Solution {
public:
bool travsel(TreeNode *root, int remain)
{
if(root->left==nullptr && root->right==nullptr && remain==0)
{ // 找到返回true
return true;
}
if(root->left==nullptr && root->right==nullptr)
{ // 没找到返回false
return false;
}
if(root->left)
{ // 进行递减
remain -= root->left->val;
if(travsel(root->left, remain))
{ // true之后返回true
return true;
}
remain += root->left->val; // 回溯
}
if(root->right)
{ // 与左节点处理逻辑一样
remain -= root->right->val;
if(travsel(root->right, remain))
{
return true;
}
remain += root->right->val;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr)
{
return false;
}
int remain = targetSum - root->val;
return travsel(root, remain);
}
};
leetcode 113. 代码实现
这题与上题的不同在于要输出路径,因此就需要两个vector,回溯也要两次找不到temp要回退,其他地方基本与上题一样
class Solution {
private:
vector<vector<int>> res; // 结果
vector<int> temp; // 临时数组
public:
void travel(TreeNode *root, int remain)
{
if(remain==0 && root->left==nullptr && root->right==nullptr)
{
res.push_back(temp);
return;
}
if(root->left==nullptr && root->right==nullptr)
{
return;
}
if(root->left)
{
remain -= root->left->val;
temp.push_back(root->left->val);
travel(root->left, remain);
temp.pop_back();
remain += root->left->val;
}
if(root->right)
{
remain -= root->right->val;
temp.push_back(root->right->val);
travel(root->right, remain);
temp.pop_back();
remain += root->right->val;
}
return;
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if(root==nullptr)
{
return res;
}
temp.push_back(root->val);
travel(root, targetSum-root->val);
return res;
}
};