Leetcode: Serialize and Deserialize Binary Tree

来源:互联网 发布:javascript 倒计时 编辑:程序博客网 时间:2024/05/22 09:51


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.

序列化比较好写,就是前序遍历,不过要记录下空节点。用”,“分割数字。反序列化的非递归,鼓捣很久呀。递归应该好写一些。

/** * 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;        if (root == nullptr) {            return result;        }                stack<TreeNode*> nodes;        while (root != nullptr || !nodes.empty()) {            while (root != nullptr) {                result += to_string(root->val) + ",";                nodes.push(root);                root = root->left;            }            result += ",";                        if (!nodes.empty()) {                root = nodes.top();                nodes.pop();                root = root->right;            }        }                return result;    }        bool getNumber(const string& data, int& val, int& pos) {        int startPos = pos;        bool negative = false;        if (data[pos] == '-') {            negative = true;            ++pos;        }                val = 0;        while (pos < data.size() && data[pos] != ',') {            val = val * 10 + (data[pos] - '0');            ++pos;        }        if (negative) {            val = -val;        }                return (startPos != pos);    }    // Decodes your encoded data to tree.    TreeNode* deserialize(string data) {        TreeNode* root = nullptr;        TreeNode* prev = nullptr;        stack<TreeNode*> nodes;        int i = 0;        while (i < data.size()) {            int val = 0;            int j = i;            if (getNumber(data, val, j)) {                TreeNode* cur = new TreeNode(val);                if (root == nullptr) {                    root = prev = cur;                    nodes.push(cur);                }                else {                    if (prev == nullptr) {                        prev = nodes.top();                        nodes.pop();                        prev->right = cur;                    }                    else {                        prev->left = cur;                    }                    nodes.push(cur);                    prev = cur;                }            }            else {                if (prev == nullptr) {                    nodes.pop();                }                else {                    prev = nullptr;                }            }            i = j + 1;        }                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 result;        if (root == nullptr) {            return result;        }                stack<TreeNode*> nodes;        while (root != nullptr || !nodes.empty()) {            while (root != nullptr) {                result += to_string(root->val) + ",";                nodes.push(root);                root = root->left;            }            result += ",";                        if (!nodes.empty()) {                root = nodes.top();                nodes.pop();                root = root->right;            }        }                return result;    }        bool getNumber(const string& data, int& val, int& pos) {        int startPos = pos;        bool negative = false;        if (data[pos] == '-') {            negative = true;            ++pos;        }                val = 0;        while (pos < data.size() && data[pos] != ',') {            val = val * 10 + (data[pos] - '0');            ++pos;        }        if (negative) {            val = -val;        }        ++pos;                return (startPos + 1 != pos);    }        TreeNode* deserializeHelper(const string& data, int& start) {        TreeNode* root = nullptr;        int val = 0;        bool isNum = getNumber(data, val, start);        if (isNum) {            root = new TreeNode(val);            root->left = deserializeHelper(data, start);            root->right = deserializeHelper(data, start);        }                return root;    }    // Decodes your encoded data to tree.    TreeNode* deserialize(string data) {        int start = 0;        return deserializeHelper(data, start);    }};// Your Codec object will be instantiated and called as such:// Codec codec;// codec.deserialize(codec.serialize(root));


0 0
原创粉丝点击