剑指offer系列第24题
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
以下图二叉树为例:
当输入整数为22时,输出两条路径,[10,5,7]和[10,12]。
解题思路:
- 首先可以明确,路径一定是开始于根节点,结束于叶子节点,每次访问的是根节点,因而采用前序遍历。
- 创建两个
vector
,一个用来保存最后所有的路径,一个用来存储当前路径。每次访问到一个节点时,先将其存入当前路径中,对他的左右节点进行判断,如果是叶子节点并且值是期望值减去上一根节点的值,那么这条路径符合要求,将当前路径添加到最终路径中。 - 每次访问到叶子节点后,前往下一路径时,需要返回到当前节点的根节点,因而需要将叶子节点从路径中删除。
- 对左右子树依次递归调用寻找路径。
代码实现:
/*
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>> res;//保存最后所有路径
vector<int> path;//保存当前路径
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(root==NULL)
return res;
path.push_back(root->val);//当前节点添加到路径中
if(!root->left&&!root->right&&expectNumber==root->val)
res.push_back(path);
FindPath(root->left,expectNumber-root->val);
FindPath(root->right,expectNumber->root->val);
path.pop_back();//将当前叶子节点从路径中删除,前往下一路径
return res;
}
};
代码已通过OJ测试。