题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始向下一直到叶子结点所经过的所有结点形成一条路径。
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
void TreePath(TreeNode* root, //当前结点
vector<int> &stack, //辅助栈,用于存放当前路径
vector<vector<int>> &path,//用于存放多条路径的二维数组
int expectNumber, //给定路径和
int sum) //当前路径和
{
sum += root -> val; //访问当前结点,更新当前路径和
stack.push_back(root -> val); //更新当前路径
if(sum == expectNumber) //如果当前路径和等于给定路径和
if(root -> left == NULL && root -> right == NULL)//且当前结点为叶子结点
path.push_back(stack); //将当前路径存入二维数组path中
if(root -> left) //如果当前结点有左结点,递归遍历其子结点
TreePath(root -> left, stack, path, expectNumber, sum);
if(root -> right) //如果当前结点有右结点,递归遍历其子结点
TreePath(root -> right, stack, path, expectNumber, sum);
stack.pop_back(); //在每次返回到父结点之前,在当前路径上删除当前结点
}
/*
将符合条件的所有路径存入二维数组path并返回
*/
vector<vector<int>> FindPath(TreeNode* root,int expectNumber)
{
vector<vector<int>> path;
if(root == NULL) //如果输入空的二叉树,则返回空的二维数组
return path;
int sum = 0;
vector<int> stack; //辅助栈,用于存放当前的路径
TreePath(root, stack, path, expectNumber, sum);
return path;
}