二叉树中和为某一值的路径
- 时间限制:1秒
- 空间限制:32768K
题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
牛客网题目链接:点击这里
VS2010代码
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
vector<int> s1;
vector<vector<int> > a1;
public:
bool WithOrder(TreeNode* root, int exp)
{
int left=0,right=0;
if(root!=NULL)
{
if( (root->val)<exp )
s1.push_back(root->val);
if( (root->val)>exp )
return 1;
if( (root->val)==exp )
{
if((root->left)==NULL && (root->right)==NULL)
{
s1.push_back(root->val);
a1.push_back(s1);
//s1.erase(s1.end()-1);
s1.pop_back();
}
return 1;
}
left=WithOrder(root->left, exp-(root->val));
right=WithOrder(root->right, exp-(root->val));
if(left && right && !s1.empty()) //左边和右边都检查过,则根出栈。
{
//s1.erase(s1.end()-1);
s1.pop_back();
}
}
return 1;
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(!root) return a1; //之前一直提示段错误,是因为没考虑到空树
if( root->val > expectNumber ) return a1;
else
{
TreeNode* p=root;
WithOrder( p, expectNumber);
}
return a1;
}
};
//创建二叉树 ||输入为字符串
TreeNode* creatbt( int* bt, int i, int n)
{
TreeNode* p=NULL;
if(i<n)
p=new TreeNode(bt[i]);
else
return NULL;
p->left=creatbt( bt, 2*i+1, n);
p->right=creatbt(bt, 2*i+2, n);
return p;
}
TreeNode* CreatBT( int* bt )
{
TreeNode* root;
int num=5;
//num=sizeof(bt)/sizeof(int);
if(num!=0)
{
root=creatbt( bt, 0, num );
}
return root;
}
//树的先序遍历
void PreOrder(TreeNode* bt)
{
if(bt!=NULL)
cout<<bt->val<<'-';
if( (bt->left)!=NULL)
PreOrder(bt->left);
if( (bt->right)!=NULL)
PreOrder(bt->right);
}
//测试用例:{10,5,12,4,7},22
//对应输出应该为:[[10,5,7],[10,12]]
int main()
{
Solution s1;
vector< vector<int> > t1;
int test1[]={10,5,12,4,7};
cout<<"建树中…"<<endl;
TreeNode* Root;
Root=CreatBT(test1);
cout<<"先序输出树"<<endl;
PreOrder(Root);
t1=s1.FindPath(Root,22);
cout<<endl;
for(int i=0; i<t1[0].size(); i++)
cout<<t1[0][i]<<' ';
cout<<endl;
for(int i=0; i<t1[1].size(); i++)
cout<<t1[1][i]<<' ';
cout<<endl;
//vector< vector<int> > t2;
//vector<int> t1;
//t1.push_back(1);
//t1.push_back(2);
//t2.push_back(t1); //用一维数组去赋值二维数组的正确方法。
//vector<vector<int> > test1;
//test1.resize(2);
// test1[0].push_back(10);
// test1[0].push_back(5);
// test1[0].push_back(7);
// test1[1].push_back(10);
// test1[1].push_back(12);
}
说明:一开始思路正确,但是一直提示段错误。后来发现是因为-未考虑树为空的情况,直接进入循环。【if(!root) return a1; //之前一直提示段错误,是因为没考虑到空树】