给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
解题思路:在上题找到是否有满足条件的路径的基础上,实际上是把符合条件的路径记录下来。
需要注意以下几点
1.如果涉及变量的修改,建议把变量构建为嵌套函数的形参。
2.每次返回到上一层递归函数之前,需要弹出最近压入的元素,否则路径中会出现不期望的元素。
vector<vector<int>> Solution::pathSum(TreeNode* root, int sum)
{
vector<vector<int>> output;
vector<int> temp;
bool result = haspathSum(root, sum, output, temp);
if(result == true)
{
return output;
}
else
{
output.clear();
return output;
}
}
bool haspathSum(TreeNode* root, int sum, vector<vector<int>> &output, vector<int> &temp)
{
/*1.如果root为空,返回false*/
if(root == NULL)
{
return false;
}
/*2.如果root左右子树都存在,递归左右子树*/
if((root->left != NULL) && (root->right != NULL))
{
temp.push_back(root->val);
/*此处没有使用haspathSum(左子树) || haspathSum(右子树)的写法是因为编译器会优化,不会执行完所有的路径*/
bool result1 = haspathSum(root->left, sum - root->val, output, temp);
bool result2 = haspathSum(root->right, sum - root->val, output, temp);
/*7.重要操作,每次回到上一层递归前,先pop出无效元素*/
temp.pop_back();
if(result1 == true || result2 == true)
{
return true;
}
else
{
return false;
}
}
/*3.如果root只有左子树存在,递归左子树*/
else if (root->left != NULL)
{
temp.push_back(root->val);
bool result3 = haspathSum(root->left, sum - root->val, output, temp);
/*7.重要操作,每次回到上一层递归前,先pop出无效元素*/
temp.pop_back();
return result3;
}
/*3.如果root只有右子树存在,递归右子树*/
else if(root->right != NULL)
{
temp.push_back(root->val);
bool result4 = haspathSum(root->right, sum - root->val, output, temp);
/*7.重要操作,每次回到上一层递归前,先pop出无效元素*/
temp.pop_back();
return result4;
}
/*5.到达叶子节点,判断节点值与当前sum值是否相等*/
else
{
if(sum == root->val)
{
temp.push_back(root->val);
output.push_back(temp);
/*7.重要操作,每次回到上一层递归前,先pop出无效元素*/
temp.pop_back();
return true;
}
else
{
/*6.此处不做操作*/
return false;
}
}
}