版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38033475/article/details/91345248
大致思路:
二叉树嘛,就递归。这道题我用dfs来解决,找好临界条件,剪枝,注意vector存储的是数值不是结点。
有一个问题就是,我这样dfs得到的结果vector数组中,并不是按vector长度从大到小来排列的,因为dfs有可能左子树的更短但是先去看的左子树的路径。因此,需要对vector数组进行排序,并且记录数组下标,从而建立新的vector数组。
我想到的方法就是map<int,int>表示“该vector的下标-该vector的长度”,再对“长度”进行排序,排序后的key就是调整好顺序的下标。但是这个实现需要通过vector,方法如下。
map的排序:先写好cmp函数,再采用vector<pair<int,int> >来存储map的内容,对vector进行排序。(详见https://blog.csdn.net/m0_38033475/article/details/79309694)
AC代码:
/*
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> > result;
void find(TreeNode* h,int expectNumber,int sum,vector<int> now) //dfs
{
now.push_back(h->val);
sum += h->val;
if(sum==expectNumber)
{
if(h->left==NULL && h->right==NULL) //必须要到达叶子结点
{
result.push_back(now);
return;
}
else
return;
}
if(sum>expectNumber)
return;
//如果已经到了叶子结点但没达到目标值,则也退出
if(h->left==NULL && h->right==NULL)
return;
if(h->left!=NULL)
find(h->left,expectNumber,sum,now);
if(h->right!=NULL)
find(h->right,expectNumber,sum,now);
}
map<int, int>m; //下标-数组长度
static bool cmp(pair<int,int> a, pair<int,int> b)
{
if(a.second>b.second)
return true;
else
return false;
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber)
{
//先判=空或只有一个
if(root==NULL)
return result;
if(root->left==NULL && root->right==NULL)
{
if(root->val==expectNumber)
{
vector<int> ans;
ans.push_back(root->val);
result.push_back(ans);
return result;
}
else
return result;
}
vector<int> ans;
find(root,expectNumber,0,ans);
//题目要求,在vector中数组长度大的靠前
//先统计每个数组的长度
for(int i=0;i<result.size();i++)
{
m[i]=result[i].size();
}
vector<pair<int,int> >v(m.begin(),m.end());
sort(v.begin(),v.end(),cmp);
vector<vector<int> > real_result;
for(int i=0;i<result.size();i++)
{
real_result.push_back(result[v[i].first]);
}
return real_result;
}
};