剑指OFFER题27------按牛客网热度排序
时间:2018.11.25.2122
作者:Waitt
题目
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
时间限制:1秒 空间限制:32768K 热度指数:260292
解答
这类问题可以用带记忆的DFS(深度优先搜索)来解决。
注意题中要求:
- 路径定义为从树的根结点一直到叶结点。
- 结点值可以小于零。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void dfsp(TreeNode* root,int a,vector<int> &zp,vector<vector<int> > &mp)
{
if(root==NULL)//迭代终止判断
return ;
/*
无论当前结点值大于,小于或等于目标值,均先压入向量。
因为结点值可正、可负、可为零。
*/
zp.push_back(root->val);
//前面两个条件用来判断是否到达叶子节点。
if(!root->left&&!root->right&&(root->val)==a)
{
mp.push_back(zp);
}
a=a-(root->val);//改变目标值。
dfsp(root->left,a,zp,mp);
dfsp(root->right,a,zp,mp);
zp.pop_back();//弹出此次搜索的结点值,表示此节点深度搜索完毕,返回其父节点。
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(root==NULL)
return vector<vector<int>>();
vector<int> zp;
vector<vector<int> > mp;
dfsp(root,expectNumber,zp,mp);
//冒泡排序,来使返回的list中,数组长度大的数组靠前
int n=mp.size();
for(int j=0;j<n;j++)
{
for(int i=n-1;i>j;i--)
{
if(mp[i].size()>mp[i-1].size())
{
vector<int> t=mp[n-1];
mp[i]=mp[i-1];
mp[i-1]=t;
}
}
}
return mp;
}
};