zoukankan      html  css  js  c++  java
  • 297. Serialize and Deserialize Binary Tree

    Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

    Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

    For example, you may serialize the following tree

        1

       /

    2   3

    /

    4   5

    as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

    Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.

    Credits:
    Special thanks to @Louis1992 for adding this problem and creating all test cases.

    Subscribe to see which companies asked this question

     

     思路:

        采用前序遍历的方法。在序列化的时候,遇到空节点,返回的字符串加上NULL,遇到非空节点,返回的字符串加上节点的值。递归得到最终的序列字符串。保证在节点之间由逗号隔开。

        在反序列化的时候,指明从start位置开始寻找逗号的位置,这样就可以截取节点对应的字符串。遇到“NULL”,直接返回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 result ="";
            preorder(root,result);
            return result;
        }
        void preorder(TreeNode *root ,string &result){
            if(result.length()>0)
                result.push_back(',');
            if(!root){
                result+="NULL";
                return;
            }
            result+=to_string(root->val);
            preorder(root->left,result);
            preorder(root->right,result);
        }
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            int start=0;
            return de_preorder(data,start);
        }
        TreeNode *de_preorder(string&data,int &start){
            if(start>=data.length())
                return NULL;
            int index =data.find(',',start);
            if(index ==string::npos){
                index =data.length();
            }
            string tmp =data.substr(start,index -start);
            start=index+1;
            if(tmp=="NULL"){
                return NULL;
            }
            TreeNode *root =new TreeNode (stoi(tmp));
            root->left =de_preorder(data,start);
            root->right=de_preorder(data,start);
            return root;
        }
    };
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
  • 相关阅读:
    hdu 3666 差分约束系统
    hdu 1198农田灌溉
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    高等微積分(高木貞治) 1.4節 例2
    常微分方程(阿諾爾德) Page 45 相空間,相流,運動,相曲線 註記
    解析函數論 Page 29 命題(2) 函數模的有界性
    高等微積分(高木貞治) 1.4節 例2
    解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
    解析函數論 Page 29 命題(3) 模的下界的可達性
    解析函數論 Page 29 命題(2) 函數模的有界性
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5280218.html
Copyright © 2011-2022 走看看