zoukankan      html  css  js  c++  java
  • leetcode 297二叉树的序列化与反序列化

    to_string(x) 将数字x转化为string

    atoi(x) 将char转化为int

    stoi(x) 将string 转化为int

    采用中序遍历的顺序存储,NULL用#表示,以,分隔,O(n)time O(n) space

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    
    /**
    使用先序递归序列来进行序列化与反序列化
    to_string转化为string以逗号分隔;递归终点x->val==NULL
    
    getline(s,str,',');每次读取','之前的字符串;递归终点str=="#"
    **/
    class Codec {
    public:
    
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {
            if(root==NULL)
                return "#";
            else
                return to_string(root->val)+","+serialize(root->left)+","+serialize(root->right);
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if(data=="#")
                return NULL;
            stringstream s(data);
            return makedeserialize(s);
        }
        TreeNode* makedeserialize(stringstream&s){
            string str;
            getline(s,str,',');
            if(str=="#")
                return NULL;
            
            TreeNode* root=new TreeNode(stoi(str));
            root->left=makedeserialize(s);
            root->right=makedeserialize(s);
            
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));

    采用层序遍历的顺序,储存每一层的值,不存在的或者NULL值用#代替,每个位置以'/'结束

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Codec {
    public:
    
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {
            string res;
            queue<TreeNode*> q;
            q.push(root);
            int flag=1;
            while(flag){
                flag=0;
                int k=q.size();
                for(int i=0;i<k;i++){
                    TreeNode* p=q.front();
                    q.pop();
                    if(p==NULL){
                        res.push_back('#');
                        q.push(NULL);
                        q.push(NULL);
                    }else{
                        int value=p->val;
                        if(value<0) {res.push_back('-');value=-value;}
                        stack<char> s;
                        if(value==0) s.push('0');
                        while(value){
                            int e=value%10;
                            s.push(e+'0');value=value/10;
                        }
                        while(!s.empty()){
                            res.push_back(s.top());s.pop();
                        }
                        q.push(p->left);
                        q.push(p->right);
                        if(p->left||p->right) flag=1;
                    }
                    res.push_back('/');
                }
            }
            cout<<res<<endl;
            return res;
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if(data.size()==0) return NULL;
            if(data.size()==2&&data[0]=='#')return NULL;
            int len=data.size();
            vector<TreeNode*> v;
            for(int i=0;i<len;i++){
                if(data[i]=='/')continue;
                TreeNode* p=NULL;
                
                if(data[i]!='#'){
                    int value=0;
                    int flag=1;
                    if(data[i]=='-') {flag=-1;i++;}
                    while(data[i]!='/'){
                        value=10*value+data[i]-'0';
                        i++;
                    }
                    value=flag*value;
                    p=new TreeNode(value);
                }
                
                v.push_back(p);
            }
            for(int i=0;i<(v.size()-1)/2;i++){
                if(v[i]!=NULL){
                    v[i]->left=v[2*i+1];
                    v[i]->right=v[2*i+2];
                }
            }
            return v[0];
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));

     测试例子如下:

    样例通过为47/48,一个深度为1000的偏二叉树没有通过;

  • 相关阅读:
    获取网络动态flash下载地址工具mark HA
    mac 下windows系统修改快捷键 HA
    CABasicAnimation HA
    喷墨和激光打印的不同点 HA
    HTML iphone HA
    html5 HA
    CastleMonoRail配置[webConfig]
    什么是MonoRail?[基础知识讲解]
    javascript常用函数
    CastleGlobalApplication.cs工程起始加载
  • 原文地址:https://www.cnblogs.com/joelwang/p/10938289.html
Copyright © 2011-2022 走看看