题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
class Solution {
public:
void FindPathDFS(TreeNode* root,int expectNumber, vector<vector<int> > &res, vector<int> &tmp){
if(root == NULL)
return;
tmp.push_back(root->val);
expectNumber -= root->val;
//已经是叶子结点,且此条路径满足条件
if(root->left == NULL && root->right == NULL && expectNumber == 0)
res.push_back(tmp);
//dfs的过程
FindPathDFS(root->left, expectNumber, res, tmp);
FindPathDFS(root->right, expectNumber, res, tmp);
//左右子树都遍历完了,且不满足条件,就出把当前结点删掉
//回退上一层的过程
tmp.pop_back();
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int> > res;
if(root == NULL)
return res;
vector<int> tmp;
FindPathDFS(root, expectNumber, res, tmp);
return res;
}
};
需要注意的点有:
- 临时存储路径的数组tmp,以及最后返回的结果都需要&传入,可能会对值进行实时修改
- 当一个结点为叶子结点,且expectNumber值处理之后还是不等于0,说明这条路径一定不满足条件,所以需要进行pop操作,完成回退,退到上一层
- 回退到上一层的时候expectNumber的值也会回到上一次操作的结果