《剑指Offer》面试题25:二叉树中和为某一值的路径
知识点
二叉树前序遍历
题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
};
解题思路
测试用例
代码(原书)
代码(牛客网)
/*
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) //二叉树为空,返回NULL
return path;
FindPathRecursive(root, expectNumber); //迭代实现
vector<vector<int>> pathResult = path;
return pathResult; //返回路径
}
private:
vector<vector<int>> path; //二维数组存储路径,每一行为一个路径
vector<int> pathOne; //一维数组存储一个路径
int currentSum = 0; //当前结点数的和
void FindPathRecursive(TreeNode* root, int expectNumber)
{
currentSum += root->val;
pathOne.push_back(root->val);
if(root->left == NULL && root->right == NULL && currentSum == expectNumber) //当前结点为叶结点,且结点和等于输入的值
{
path.push_back(pathOne); //将当前路径存储到path的一行中
}
//当前结点不为叶结点,则分别向下遍历左右结点
if(root->left)
{
FindPathRecursive(root->left, expectNumber);
}
if(root->right)
{
FindPathRecursive(root->right, expectNumber);
}
//返回到父结点之前,在路径上删除该结点,在当前结点和中减去结点值
currentSum -= root->val;
pathOne.pop_back();
}
};