题目来源
牛客网剑指offer
题目介绍
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root, int expectNumber) {
}
}
题目思路
作为树结构,只要不是简单的遍历(因为遍历树还让你用递归,这样的题目简直送分,所以考出来的可能性几乎为零),基本上想到的方法就是递归。
思路方向正确了那就直接来进行详细分析:
1.首先确定递归函数,首先不能使用原函数进行遍历,因为符合题目要求的函数至少需要四个参数(这里不能使用静态变量)。头两个变量题目要求已经给出,就是TreeNode* 和int类型的,还有一个就是路径变量,记录了从顶点到当前顶点的路径变量vector path,还有一个变量就是我们的结果返回值变量vector<vector>ret;
总结
需要四个变量如下:
TreeNode* root;
int expectNumber;
vector<int> path;
vector<vector<int>>ret;
2.根据以上的分析可以构造如下的递归函数:
void GetPath(TreeNode* p, int ex, vector<vector<int>>&resutl, vector<int>path)
首先确定递归的结束判断,直接上代码:
//说明到达了叶节点了,并没有符合条件,路径和等于ex
else if (p == NULL)return;
接下来写递归逻辑部分:
//判断叶节点,如果符合路径和等于ex,则添加路径
if ((p->val == ex)&&(p->left==NULL)&&(p->right==NULL))
{
path.push_back(p->val);
resutl.push_back(path);
}
else
{
//否则递归左子树和右子树。
path.push_back(p->val);
GetPath(p->left, ex - p->val, resutl, path);
GetPath(p->right, ex - p->val, resutl, path);
}
整体源码如下所示
vector<vector<int> > FindPath(TreeNode* root, int expectNumber) {
vector<vector<int>> ret;
vector<int>path;
if (root == NULL)return ret;
path.push_back(root->val);
//用于判断只有一个根节点的情况。
if ((root->left == NULL) && (root->right == NULL))
{
ret.push_back(path);
return ret;
}
expectNumber -= root->val;
GetPath(root->left, expectNumber, ret, path);
GetPath(root->right, expectNumber, ret, path);
return ret;
}
整体代码如下:
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root, int expectNumber) {
vector<vector<int>> ret;
vector<int>path;
if (root == NULL)return ret;
path.push_back(root->val);
if ((root->left == NULL) && (root->right == NULL))
{
ret.push_back(path);
return ret;
}
expectNumber -= root->val;
GetPath(root->left, expectNumber, ret, path);
GetPath(root->right, expectNumber, ret, path);
return ret;
}
void GetPath(TreeNode* p, int ex, vector<vector<int>>&resutl, vector<int>path)
{
if (p == NULL)return;
if ((p->val == ex) && (p->left == NULL) && (p->right == NULL))
{
path.push_back(p->val);
resutl.push_back(path);
}
else
{
path.push_back(p->val);
GetPath(p->left, ex - p->val, resutl, path);
GetPath(p->right, ex - p->val, resutl, path);
}
}
};
说明代码没有进行优化处理,这里只是提供一种解题思路,并且在保证过了的前提下贴出我的源码。