面试题25:二叉树中和为某一值的路径
题目描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
题目分析:
路径指从根结点到叶子结点的一条路。
解决方法,还是递归实现二叉树遍历。
只有先序遍历是先访问根结点,所以这里选用先序遍历。当有多条路径或者当前路径不满足条件,则需要将当前结点从路径删除。
代码如下:
/*
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) {
vector<vector<int> > ret;
vector<int> nums;
if (root == NULL)
return ret;
FindWay(root, ret, expectNumber, nums);
return ret;
}
void FindWay(TreeNode *root, vector<vector<int> > &ret, int target, vector<int> &nums) {
nums.push_back(root->val);
if (IsLeaf(root) && root->val == target) {
ret.push_back(nums);
}
if (root->left) {
FindWay(root->left, ret, target - root->val, nums);
}
if (root->right) {
FindWay(root->right, ret, target - root->val, nums);
}
nums.pop_back();
}
bool IsLeaf(TreeNode *node) {
if (node->left == NULL && node->right == NULL)
return true;
else
return false;
}
};