https://leetcode.com/problems/path-sum-ii/
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and
sum = 22
,5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
Return:
[ [5,4,11,2], [5,8,4,5] ]
递归版:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> pathSum(TreeNode* root, int sum) {
if(root == NULL) return result;
vector<int> inter_num;
dfs(root, inter_num, sum);
return result;
}
void dfs(TreeNode *cur_node, vector<int> &inter_num, int cnt){
inter_num.push_back(cur_node->val);
cnt -= cur_node->val;
if(cur_node->left == NULL && cur_node->right == NULL){
if(cnt == 0) result.push_back(inter_num);
}else{
if(cur_node->left != NULL) dfs(cur_node->left, inter_num, cnt);
if(cur_node->right != NULL) dfs(cur_node->right, inter_num, cnt);
}
inter_num.pop_back();
}
};
迭代版:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<TreeNode*> stack;
vector<vector<int>> ans;
vector<int> path;
TreeNode *pre=NULL,*cur=root;
int check=0;
while(cur!=NULL || stack.size()!=0){
while(cur!=NULL){
stack.push_back(cur);
path.push_back(cur->val);
check+=cur->val;
cur=cur->left;
}
cur=stack.back();
if(cur->left==NULL && cur->right==NULL && check==sum){
ans.push_back(path);
}
if(cur->right!=NULL && cur->right!=pre){
cur=cur->right;
continue;
}
pre=cur;
stack.pop_back();
path.pop_back();
check-=cur->val;
cur=NULL;
}
return ans;
}
};
后序遍历版:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> result;
vector<int> inter_nums;
int inter_cnt = 0;
stack<TreeNode*> S;
if(root == NULL) return result;
S.push(root);
S.push(root);
TreeNode *cur = root;
while(!S.empty()){
cur = S.top(); S.pop();
if(!S.empty() && cur == S.top()){
// cout << "F: " << cur->val << endl;
inter_nums.push_back(cur->val);
inter_cnt += cur->val;
if(cur->left == NULL && cur->right == NULL){
if(inter_cnt == sum) result.push_back(inter_nums);
}else{
if(cur->right != NULL){
S.push(cur->right);
S.push(cur->right);
}
if(cur->left != NULL){
S.push(cur->left);
S.push(cur->left);
}
}
}else{
// cout << "S: " << cur->val << endl;
inter_cnt -= cur->val;
inter_nums.pop_back();
}
}
return result;
}
};