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 1Return:
[ [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;
}
};

本文详细解析了LeetCode上路径总和II问题的三种解决方案:递归、迭代及后序遍历方法。通过实例讲解如何在二叉树中寻找所有从根节点到叶子节点的路径,使路径上的节点值之和等于指定值。
618

被折叠的 条评论
为什么被折叠?



