• 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.

    Example: 

    You may serialize the following tree:
    
        1
       / 
      2   3
         / 
        4   5
    
    as "[1,2,3,null,null,4,5]"
    

    Clarification: The above format is the same as how LeetCode 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.

    解题思路:

    参考了Grandyang的解法

    需要注意的是istringstream以‘ ’为间断

    所以在输入的时候,后面一定要加' '

    代码:

    /**
     * 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) {
            ostringstream out;
            serialize(root, out);
            return out.str();
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            istringstream in(data);
            return deserialize(in);
        }
    private:
        void serialize(TreeNode *root, ostringstream &out){
            if(root){
                out<<root->val<<' ';
                serialize(root->left, out);
                serialize(root->right, out);
            }else{
                out<<"* ";
            }
        }
        TreeNode* deserialize(istringstream &in){
            string val;
            in >> val;
            if(val == "*")
                return nullptr;
            TreeNode *root = new TreeNode(stoi(val));
            root->left = deserialize(in);
            root->right = deserialize(in);
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));

     又做一次,使用的层序遍历的解法。

    /**
     * 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 ret = "";
            if(!root) return "*";
            queue<TreeNode*> nodeQ;
            nodeQ.push(root);
            while(!nodeQ.empty()){
                TreeNode* curNode = nodeQ.front();
                nodeQ.pop();
                if(curNode){
                    ret.append(to_string(curNode->val));
                    nodeQ.push(curNode->left);
                    nodeQ.push(curNode->right);
                }else{
                    ret.append("*");
                }
                ret.append("_");
            }
            std::cout << ret << std::endl;
            return ret;
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if(data == "*" || data.empty()) return NULL;
            int start = 0;
            TreeNode* root;
            queue<TreeNode*> nodeQ;
            int assignedChild = 0;
            while(start < data.size()){
                int end = data.find("_", start);
                string nodeV = data.substr(start, end-start);
                start = end+1;
                if(nodeQ.empty()){
                    int v = atoi(nodeV.c_str());
                    TreeNode* n = new TreeNode(v);
                    root = n;
                    nodeQ.push(n);
                }else{
                    TreeNode* pNode = nodeQ.front();
                    //std::cout << pNode->val << " : " << nodeV << std::endl;
                    if(!pNode) continue;
                    if(nodeV != "*"){
                        int v = atoi(nodeV.c_str());
                        TreeNode* child = new TreeNode(v); 
                        nodeQ.push(child);
                        if(assignedChild == 0){
                            pNode->left = child;
                        }else{
                            pNode->right = child;
                        }
                    }
                    ++assignedChild;
                    assignedChild %= 2;
                    if(assignedChild == 0){
                        nodeQ.pop();
                    }
                }
            }
            
            return root;
        }
    };
  • 相关阅读:
    C#动态编译计算表达式的值 拓荒者
    Microsoft AJAX Library对 Error的扩展 拓荒者
    在分布式事务(MSDTC)中使用OLE DB数据库连接访问数据 拓荒者
    【转】ExtJS DateField 日期控件Format格式化 拓荒者
    自定义 Web 服务器控件 拓荒者
    Microsoft AJAX Library对 Array的扩展 拓荒者
    (转载)IE 浏览器的创新
    XUnit配置Resharper快捷键
    表现层模式MVC
    读Clean Code 数据结构和对象
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9177552.html
Copyright © 2020-2023  润新知