题目描述:
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。
解题思路:
1. 当用前序遍历的方式访问到某一结点(假设值为val,不是叶子结点)时,我们把该结点添加到路径上。
2. 访问子结点的时候,原问题就变为求二叉树中和为sum-val的路径,很明显是递归的过程。
3. 如果当前结点为叶子结点并且值等于新的sum,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。
4.当前结点访问结束后,递归函数将自动回到它的父结点。这里要注意的是:在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到父结点的路径。
Demo:
/*
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>> vec;
vector<int> path;
vector<vector<int>> FindPath(TreeNode* root,int expectNumber) {
fun(root, expectNumber);
return vec;
}
void fun(TreeNode* proot, int sum){
if (proot == nullptr) return;
path.push_back(proot->val);
// 判断是否是叶子结点同时满足和则加入该路径
if (!proot->left && !proot->right && sum == proot->val)
vec.push_back(path);
else
{
if (proot->left != nullptr)
fun(proot->left, sum - proot->val);
if (proot->right != nullptr)
fun(proot->right, sum - proot->val);
}
// 移除最后一个元素
path.pop_back();
}
};