二叉树的序列化和反序列化

来源:互联网 发布:mfc socket网络编程 编辑:程序博客网 时间:2024/04/28 03:03

设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。

如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。

样例

给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:

  3 / \9  20  /  \ 15   7

我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。

你可以采用其他的方法进行序列化和反序列化。

/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /**     * This method will be invoked first, you should design your own algorithm      * to serialize a binary tree which denote by a root node to a string which     * can be easily deserialized by your own "deserialize" method later.     */    string serialize(TreeNode *root) {        // write your code here        string temp;        if (root == NULL)        {            return temp;        }        char str[10];        queue<TreeNode*> buf;        buf.push(root);        while (!buf.empty())        {            TreeNode *front = buf.front();            if (front != NULL)            {                sprintf(str, "%d", front->val);                temp += str;                buf.push(front->left);                buf.push(front->right);            }            else            {                temp += "#";            }            temp += " ";            buf.pop();        }        int end = temp.length()-1;        while (temp[end] == '#' || temp[end] == ' ')        {            end--;        }        return temp.substr(0, end+1);    }    /**     * This method will be invoked second, the argument data is what exactly     * you serialized at method "serialize", that means the data is not given by     * system, it's given by your own serialize method. So the format of data is     * designed by yourself, and deserialize it here as you serialize it in      * "serialize" method.     */    TreeNode *deserialize(string data) {        // write your code here        int n = data.length();        if (n < 1)        {            return NULL;        }        vector<int> pos;        pos.push_back(-1);        for (int i = 0; i < n; i++)        {            if (data[i] == ' ')            {                pos.push_back(i);            }        }        if (pos.size() == 1)        {            return new TreeNode(atoi(data.c_str()));        }        pos.push_back(n);        vector<TreeNode*> nodes;        for (int i = 0; i < pos.size()-1; i++)        {            string temp = data.substr(pos[i]+1, pos[i+1]-pos[i]-1);            if (temp == "#")            {                nodes.push_back(NULL);            }            else            {                TreeNode *p = new TreeNode(atoi(temp.c_str()));                nodes.push_back(p);            }        }        int m = nodes.size();        int p = 1;        int q = 0;        while (p < m)        {            if (nodes[q] == NULL)            {                q++;            }            else            {                nodes[q]->left = nodes[p];                nodes[q]->right = nodes[p+1];                p += 2;                q++;            }        }        return nodes[0];    }};


0 0
原创粉丝点击