目录
5
/ \
4 6
/ \ / \
1 2 9 8
给定一个目标值,找到一条从根节点到叶子节点的路径,使这个路径的节点总和等于目标值
如给定目标值11
路径即为输出:5->4->2
与之前的二叉树的所有路径比较相似,这次多了一个数字。
思路:
从根节点出发进行前序遍历,每次遍历完一个节点count就减去该节点的数据,如果发现节点的左右节点都为空(即叶子节点)且count==0;就将收集好的vector<int> path转化为字符串。
转化字符串
这里在所有路径那一样
将录入完成的vector<int>进行遍历,装入一个string里,同时每装一个就在string尾处加上"->"
这一部分的代码如下:
if (cur->left == NULL && cur->right == NULL && count == 0)
{
string str;
for (int i = 0; i < path.size(); i++)
{
str += to_string(path[i]);
str += "->";
}
str.pop_back();
str.pop_back();
resultpro.push_back(str);
}
即终止条件为
if (cur->left == NULL && cur->right == NULL && count == 0)
if (cur->left == NULL && cur->right == NULL && count != 0)
return;
递归
在递归前,我们已经将NULL的情况处理了,这将不会操作空指针。
if (cur->left)
{
path.push_back(cur->left->a);
traversal(cur->left, count - cur->left->a);
path.pop_back();
}
if (cur->right)
{
path.push_back(cur->right->a);
traversal(cur->right, count - cur->right->a);
path.pop_back();
}
return;
可以发现,在每一层的递归当中,我们没有直接在递归中用count--,而是在调用自己传入参数的时候传入减去下一个节点数据的count。
这样,当这层递归完成后,归的时候count就又会恢复为原count,同时path也进行pop();
整体代码:
class waysumII
{
private:
vector<int> path;
string result;
void traversal(treenode* cur, int count)
{
{
string str;
for (int i = 0; i < path.size(); i++)
{
str += to_string(path[i]);
str += "->";
}
str.pop_back();
str.pop_back();
resultpro.push_back(str);
}
if (cur->left == NULL && cur->right == NULL && count!= 0)
return;
if (cur->left)
{
path.push_back(cur->left->a);
traversal(cur->left, count - cur->left->a);
path.pop_back();
}
if (cur->right)
{
path.push_back(cur->right->a);
traversal(cur->right, count - cur->right->a);
path.pop_back();
}
return;
}
public:
vector<string> WaysumII(treenode* root, int sum)
{
path.push_back(root->a);
traversal(root, sum - root->a);
return result;
}
};