给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22
,
返回:
这道题目没什么太大难度,主要是一些启发。比如在类似leetcode 这种只给一个函数,固定输入输出类型的情况下,如何使用自己顺手的搜索方式,还有传参问题。具体看代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {//自己写代码的话搜索不会用带返回值的这种,一般都习惯直接写全局变量
vector<int> vt;
vector<vector<int>> v;
find(root, vt, v, sum);//这样就可以在这个函数内部再建一个函数
return v;
}
//但是最终的vector还是要返回到上边那个函数的,怎么办呢?此时可以用引用,这样就把v看做pahtSum和find两个函数统一的变量,避免递归时存在返回值的情况
void find(TreeNode *root, vector<int>vt, vector<vector<int>>&v, int sum)
{
if(root == NULL)//LeetCode的根节点貌似貌似都是空节点?不加这句会报错
return;
if(root -> left == NULL && root -> right == NULL)
{
if(sum == root -> val)
{
vt.push_back(root -> val);
v.push_back(vt);
}
return;
}
vt.push_back(root -> val);
// printf("push:%d\n", vt.back());
find(root -> left, vt, v, sum - root -> val);
find(root -> right, vt, v, sum - root -> val);
// printf("pop:%d\n", vt.back());
vt.pop_back();
}
};