微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

For 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,5]
]

//method1:递归版本
class Solution{
    public:
        vector<vector<int>> pathSum(TreeNode* root,int sum){
            vector<vector<int>> res;
            vector<int> out;
            helper(root,sum,out,res);
            return res;
        }
    
    void helper(TreeNode* node,int sum,vector<int>& out,vector<vector<int>>& res){
        if(!node) return;
        out.push_back(node->val);//1
        if(sum == node->val && !node->left && !node->right){
            res.push_back(out);
        } 
        
        helper(node->left,sum-node->val,out,res);
        helper(node->right,res);
        out.pop_back();//由于以上1处是先把val加到vector中,如果不符合需要跳转到上一级,此处需要弹出处理;  
    }
};


//迭代版本
//注意:11处要考虑最左节点不是叶子节点,下面还有一个右子节点的情况;
//可以参看:https://www.cnblogs.com/grandyang/p/4042156.html
class Solution{
    public:
          vector<vector<int>> pathSum(TreeNode* root,int sum){
            vector<vector<int>> res;
            vector<TreeNode*> s;
            TreeNode *cur = root,*pre = NULL;
            int val = 0;
            while(cur || !s.empty()){
                while(cur){
                    s.push_back(cur);
                    val += cur->val;
                    cur = cur->left;
                }
                cur = cur->back();  
                if(!cur->left && !cur->right && val == sum){
                    vector<int> v;
                    for(auto it : s){
                        v.push_back(it->val);
                    }
                    res.push_back(v);
                }
                if(cur->right && cur->right != pre) cur = cur->right;//11
                else{
                    pre = cur;
                    val -= cur->val;
                    s.pop_back();
                    cur = NULL;
                }
            }  
              
            return res;
          }
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐