题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解题思路
可以通过递归方法解决这个问题,我们每访问到一个节点的时候,对该节点进行判断:如果该节点是叶子节点(左右子树都为空),且值等于所需要的值,那么可以将该节点的值存入路径,并将路径进行存储;如果节点不满足条件,那么继续往下进行递归访问它的子节点。当访问结束后,递归函数将自动回到它的父结点。因此我们在函数退出之前要在路径上删除当前结点,以确保返回父节点时路径刚好从根结点到父节点的路径。
代码
/*
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 == NULL )
return res;
vector<int> temp_res;
help(temp_res, root, expectNumber);
return res;
}
vector<vector<int>> res;
void help(vector<int> temp_res, TreeNode* node,int num)
{
if( node->left == NULL && node->right == NULL && node->val == num )
{
temp_res.push_back(node->val);
res.push_back(temp_res);
return;
}
temp_res.push_back( node->val );
if( node->left != NULL )
help(temp_res, node->left, num-node->val );
if( node->right != NULL )
help(temp_res, node->right, num-node->val );
return;
}
};