题目:输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
题目抽象:给定一颗二叉树,找出满足从根节点到叶子节点和为sun的所有路径。
思路:审清题意,问题是将根节点到叶子节点经过的结点形成一条路径。
1.先是根节点,再是左右子节点,因此考虑前序遍历;
2.考虑使用两个vector容器来保存路径,一个存放中间过程的每个值,另一个存放满足条件的路径;
3.再树结构中计算和为某个值:
方法一:新建一个辅助变量,不断叠加与目标值比较;
方法二:从目标值递减去当前节点的值,直到叶子节点为0.
代码
class Solution {
public:
using vvi=vector<vector<int>>;
using vi=vector<int>;
void dfs(TreeNode *root,int num,vi &path,vvi &res){
path.push_back(root->val);//将当前节点的值加入路径
if(num==root->val&&!root->left&&!root->right){//base case:当当前节点的值和目标相等时,将前面的路径加入到总路径容器中
res.push_back(path);
}
if(root->left) dfs(root->left,num-root->val, path,res);
if(root->right) dfs(root->right,num-root->val, path,res);
path.pop_back();//这一步表明当前路径走到该结点走不通,删除掉该结点,回溯回去继续遍历
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vvi res;
vi path;
if(!root){
return res;
}
dfs(root,expectNumber,path,res);
return res;
}
};