zoukankan      html  css  js  c++  java
  • [LeetCode] Serialize and Deserialize Binary Tree

    I adopt a way similar to that of the OJ to serialize the binary tree. For the following tree, my serialization result is "1,2,3,null,null,4,5," (note the last comma).

        1
       / 
      2   3
         / 
        4   5

    The serialization and deserialization both use the BFS traversal. The code is as follows.

    /**
     * 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) {
            vector<string> nodes;
            queue<TreeNode*> level;
            level.push(root);
            while (!level.empty()) {
                int n = level.size();
                for (int i = 0; i < n; i++) {
                    TreeNode* node = level.front(); level.pop();
                    nodes.push_back(node ? to_string(node->val) + "," : "null,");
                    if (node) {
                        level.push(node->left);
                        level.push(node->right);
                    }
                }
            }
            while (!nodes.empty() && nodes.back() == "null,")
                nodes.pop_back();
            string tree;
            for (string node : nodes) tree += node;
            return tree;
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            if (data.empty()) return NULL;
            stringstream ss(data);
            string vs;
            getline(ss, vs, ',');
            TreeNode* root = new TreeNode(stoi(vs));
            queue<TreeNode*> level;
            level.push(root);
            while (!level.empty()) {
                int n = level.size();
                for (int i = 0; i < n; i++) {
                    TreeNode* node = level.front(); level.pop();
                    if (getline(ss, vs, ',') && vs != "null") {
                        node->left = new TreeNode(stoi(vs));
                        level.push(node -> left);
                    }
                    if (getline(ss, vs, ',') && vs != "null") {
                        node->right = new TreeNode(stoi(vs));
                        level.push(node -> right);
                    }
                }
            }
            return root;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
  • 相关阅读:
    vim字符串替换命令
    Android中View的事件分发机制——Android开发艺术探索笔记
    jQuery源代码框架思路
    C指针——C语言手记
    Python基础二--基本控制语句
    C++中的链式操作
    求一个字串中最长的连续字符串
    C# -- 推断字符能否转化为整形
    Loadrunner检查点使用总结
    LoadRunner设置检查点的几种方法介绍
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4923497.html
Copyright © 2011-2022 走看看