题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
考察点:具体例子抽象函数;二叉树遍历
思路:代码如下,递归的思想。FindPath函数不太好理解。
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
void FindPath
(
vector<vector<int>> & result,//保存结果的二维数组
TreeNode* root, //当前根节点
int expectNumber, //期望数字
vector<int>& path, // 当前路径
int currentSum // 当前求和
)
{
currentSum += root->val;//加和
path.push_back(root->val);//入数组
bool isLeaf = root->left == NULL && root->right == NULL; //判断是否为叶子节点
if (isLeaf && expectNumber == currentSum) //是叶子节点并且值相等,加入路径
{
result.push_back(path);
}
if (currentSum > expectNumber)//超过期望值,直接结束
return;
if (root->left)//去左子树
FindPath(result, root->left, expectNumber, path, currentSum);
if (root->right)//去右子树
FindPath(result, root->right, expectNumber, path, currentSum);
//返回父节点,删除当前节点,如果没有,改变的currentSum无效。
path.pop_back();
}
vector<vector<int> > FindPath(TreeNode* root, int expectNumber) {
vector<vector<int>> result;
if (root == NULL)
return result;
vector<int> path;
int currentSum = 0;//初始化
FindPath(result, root, expectNumber, path, currentSum);
return result;
}
//测试代码,查看单步过程,毕竟递归实在是不好理解。
int main()
{
TreeNode* root = new TreeNode(10);
TreeNode* root2 = new TreeNode(5);
TreeNode* root3 = new TreeNode(12);
TreeNode* root4 = new TreeNode(4);
TreeNode* root5 = new TreeNode(17);
root->left = root2;
root->right = root3;
root2->left = root4;
root2->right = root5;
vector<vector<int> > result = FindPath(root, 22);
}