题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
- 递归先序遍历树, 把结点加入路径。
- 若该结点是叶子结点则比较当前路径和是否等于期待和。是的话打印从根节点到叶子节点的路径。
- 弹出结点,每一轮递归返回到父结点时,当前路径也应该回退一个结点
树的定义:
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL) { }
};
#include<iostream>
using namespace std;
#include<vector>
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL) { }
};
/*
void Print(TreeNode *root,vector<int>&v,int &curNumber,int expectNumber)
{
if(root == NULL)
return ;
curNumber += root->val;
v.push_back(root->val);
bool isLeaf = (root->left == NULL && root->right == NULL);
if(curNumber == expectNumber && isLeaf)
{
for(int i = 0; i < v.size(); ++i)
{
cout << v[i] << " ";
}
cout <<endl;
}
if(root->left)
Print(root->left,v,curNumber,expectNumber);
if(root->right)
Print(root->right,v,curNumber,expectNumber);
curNumber -= root->val;
v.pop_back();
}
void FindPath(TreeNode *root,int expectNumber)
{
vector<int> v;
int curNumber = 0;
Print(root,v,curNumber,expectNumber);
}
*/
void FindPath(TreeNode *root,int expectNumber,int &curNumber,vector<int> &v, vector<vector<int> > &ret)
{
if(root == NULL)
return ;
curNumber += root->val;
v.push_back(root->val);
bool isLeaf = (root->left == NULL && root->right == NULL);
if(curNumber == expectNumber && isLeaf)
{
ret.push_back(v);
}
if(root->left)
FindPath(root->left,expectNumber,curNumber,v,ret);
if(root->right)
FindPath(root->right,expectNumber,curNumber,v,ret);
curNumber -= root->val;
v.pop_back();
}
vector<vector<int> > FindPath(TreeNode *root,int expectNumber)
{
vector< vector<int> > ret ;
vector<int>v;
int cursum = 0;
FindPath(root,expectNumber,cursum,v,ret);
return ret;
}
void test()
{
TreeNode *p1 = new TreeNode(10);
TreeNode *p2 = new TreeNode(5);
TreeNode *p3 = new TreeNode(12);
TreeNode *p4 = new TreeNode(4);
TreeNode *p5 = new TreeNode(7);
p1->left = p2;
p1->right = p3;
p2->left = p4;
p2->right = p5;
vector<vector<int> > ret = FindPath(p1,22);
for(int i = 0; i < ret.size(); ++i)
{
for(int j = 0; j< ret[i].size(); ++j)
cout << ret[i][j] << " ";
cout <<endl;
}
}
int main()
{
test();
cout << "hello ...."<<endl;
return 0;
}