leetcode 二叉树的序列化与反序列化 困难

 

 

序列化方式参考:https://www.cnblogs.com/rookie-acmer/p/15208399.html

即:null 结点用 # 号表示,并且用英文逗号 ',' 进行分割

然后就是还原建树的问题:如果能对左儿子进行建树,就对左儿子建树;不能,则对右儿子建树;

class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string treeStr;
        doSerialize(root, treeStr);
        return treeStr;
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(const string& data) {
        int i = 0;
        return doDeserialize(data, i);
    }

private:
    string intToStr(int val) {
        if(val == 0) return "0";
        int flag = val < 0;
        deque<char> deq;
        val = abs(val);
        while(val) {
            deq.push_front(val % 10 + '0');
            val /= 10;
        }
        if(flag) deq.push_front('-');
        return string(deq.begin(), deq.end());
    }

    void doSerialize(TreeNode *root, string &treeStr) {
        if(!root) {
            treeStr.push_back('#');
            treeStr.push_back(',');
            return;
        }
        treeStr += intToStr(root -> val);
        treeStr.push_back(',');
        doSerialize(root -> left);
        doSerialize(root -> right);
    }

    TreeNode *doDeserialize(const string& data, int &i) {    // 注意 i 是引用类型
        if(data[i] == '#') return nullptr;
        TreeNode *root = new TreeNode;
        int val = 0;
        int flag = false;
        if(data[i] == '-') {
            flag = true;
            ++ i;
        }
        while(i < data.size() && data[i] != ',') {
            val = val * 10 + (data[i] - '0');
            ++ i;
        }
        root -> val = flag ? -val : val;
        // i 在逗号的位置
        ++ i;
        root -> left = doDeserialize(data, i);
        // i 在 # 的位置
        i += 2;
        root -> right = doDeserialize(data, i);
        return root;
    }
};

 

posted @ 2021-09-16 16:46  rookie_Acmer  阅读(36)  评论(0)    收藏  举报