题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
递归版本
class Solution {
public:
vector<vector<int>> res;
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<int> ans;
__FindPath(root, expectNumber, 0, ans);
return res;
}
void __FindPath(TreeNode* root,int expectNumber, int sum, vector<int>ans){
if(root == nullptr) return;
if(!root->left && !root->right && sum+root->val == expectNumber){
ans.push_back(root->val);
res.push_back(ans);
return;
}
ans.push_back(root->val);
__FindPath(root->left, expectNumber, root->val + sum, ans);
__FindPath(root->right, expectNumber, root->val + sum, ans);
}
};
非递归版本
class Solution {
public:
vector<vector<int>> res;
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
__FindPath(root,expectNumber);
return res;
}
void __FindPath(TreeNode * root, int expectNumber){
stack<pair<TreeNode*,vector<int>>>stk;
if(root == nullptr) return;
stk.push(pair<TreeNode*,vector<int>>(root, vector<int>{root->val}));
while(!stk.empty()){
pair<TreeNode*, vector<int>> vertex = stk.top();
TreeNode * node = vertex.first;
vector<int> path = vertex.second;
if(!node->left && !node->right && accumulate(path.begin(), path.end(),0) == expectNumber){
res.push_back(path);
}
stk.pop();
if(node->right){
TreeNode *nex = node->right;
path.push_back(nex->val);
stk.push(pair<TreeNode*, vector<int>>(nex, path));
path.pop_back();
}
if(node->left){
TreeNode *nex = node->left;
path.push_back(nex->val);
stk.push(pair<TreeNode*, vector<int>>(nex, path));
}
}
}
};