37

1. 描述

请实现两个函数,分别用来序列化和反序列化二叉树。

2. 题解

n = i_pushed.size()
时间复杂度: O(n)
空间复杂度: O(n)

我们可以将一棵树保存前序和中序遍历(或中序和后序),然后重建二叉树,但是这要求树中所有节点的值不一样,题目并没有给出这样的保证。
因此我们可以将其按照先序遍历的形式保存节点,空节点用一个特殊符号替代,遍历到特殊符号时就知道遍历到了空节点,到了递归的边界。

class Codec 
{
private:
    TreeNode* deserialize(stringstream &i_stream)
    {
        string node;
        i_stream >>node;
        if(node == string("#")) // nullptr
        {
            return nullptr;
        }
        else
        {
            int value = stoi(node);
            auto root = new TreeNode(value);
            root->left = deserialize(i_stream);
            root->right = deserialize(i_stream);

            return root;
        }
    }
public:
    // Encodes a tree to a single string.
    // string serialize(TreeNode* root)
    string serialize(TreeNode *i_root) 
    {
        if(!i_root) return string("# ");

        string nodes = to_string(i_root->val) + string(" ");
        return nodes + serialize(i_root->left) + serialize(i_root->right);
    }

    // Decodes your encoded data to tree.
    // TreeNode* deserialize(string data)
    TreeNode* deserialize(string i_data) 
    {
        stringstream stream(i_data);
        return deserialize(stream);
    }
};
Last updated:
Tags:
comments powered by Disqus