// 面试题34:二叉树中和为某一值的路径
// 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
// 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
static std::vector<std::vector<int>> find_path(const std::shared_ptr<node_bt<int>>& root, int num)
{
std::vector<std::vector<int>> matrix;
if(root == nullptr)
{
return matrix;
}
std::vector<int> path;
int sum = 0;
_find_path(root, num, path, sum, matrix);
return matrix;
}
static void _find_path(const std::shared_ptr<node_bt<int>>& root,
int num, std::vector<int>& path, int& sum,
std::vector<std::vector<int>>& matrix)
{
sum += root->data;
path.push_back(root->data);
// 如果是叶结点,并且路径上结点的和等于输入的值
// 打印出这条路径
if(sum == num && root->left == nullptr && root->right == nullptr)
{
std::vector<int> temp;
for(auto& t:path)
{
temp.push_back(t);
}
matrix.push_back(temp);
}
// 如果不是叶结点,则遍历它的子结点
if(root->left != nullptr)
{
_find_path(root->left, num, path, sum, matrix);
}
if(root->right != nullptr)
{
_find_path(root->right, num, path, sum, matrix);
}
// 在返回到父结点之前,在路径上删除当前结点,
// 并在currentSum中减去当前结点的值
sum -= root->data;
path.pop_back();
}