题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
#include<iostream>
#include<vector>
using namespace std;
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)
{
if(root) dfsFind(root,expectNumber);
return all;
}
vector<int > temp;
vector<vector<int > > all;
void dfsFind(TreeNode *node,int left)
{
temp.push_back(node->val);
if(left-node->val==0 &&!node->left &&!node->right)//到达叶子结点,而且值刚好等于路径之和
{
all.push_back(temp);
}
else
{
if(node->left) dfsFind(node->left,left-node->val);
if(node->right)dfsFind(node->right,left-node->val);
}
temp.pop_back();//如果不满足路径和为预期值 将最后一个值剔除 返回到上一层
//递归的时候 理不清怎么办?如下图,搞清楚每个节点在进入容器的时候 他进行到哪一步 他的下一步是什么就可以
}
};
int main()
{
//构建二叉树
/*
1
2 3
4 6 3
找出节点和为7的路径
输出为 1 2 4
1 3 3
*/
Solution sol;
vector<vector<int> >res;
TreeNode *root=new TreeNode(1);
root->left=new TreeNode(2);
root->right=new TreeNode(3);
root->left->left=new TreeNode(4);
root->left->right=new TreeNode(6);
root->right->left=new TreeNode(3);
res=sol.FindPath(root,7);
for(int i=0;i<res.size();i++)
{
for(int j=0;j<res[i].size();j++)
{
cout<<res[i][j]<<" ";
}
cout<<endl;
}
return 0;
}