美文网首页
449.serialize-and-deserialize-bs

449.serialize-and-deserialize-bs

作者: Optimization | 来源:发表于2020-06-06 12:34 被阅读0次
问题:

1.不要用考试的心态对待。
2.看的时候准备好几个优质答案,减少搜索难度。目前有4个优秀答案可供选择。
3.仔细分析问题。
4.注释代码。分析为什么才是一切中的重中之重。

正文:
method1:
class Codec {
public:

    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        ostringstream out;
        serialize(root, out);
        return out.str();
    }

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        istringstream in(data);
        return deserialize(in);
    }
private:
    void serialize(TreeNode* root, ostringstream& out){
        if (!root) {
            out <<"# ";
            return;
        }
        out << root->val<<" ";
        serialize(root->left, out);
        serialize(root->right, out);
    }

    TreeNode* deserialize(istringstream& in) {
        string val;
        in >> val;
        if(val == "#") return nullptr;
        TreeNode* root = new TreeNode(stoi(val));
        root->left = deserialize(in);
        root->right = deserialize(in);
        return root;
    }
};
method2:
class Codec {
public:
    // 如何抓住二叉搜索树的特点呢?
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) {
        string s;
        serialize(root, s);
        return s;
    }

    // Decodes your encoded data to tree.
    // 反序列化,不太熟,不太熟的地方在哪呢
    // 
    TreeNode* deserialize(string data) {
        int pos = 0;
        return deserialize(data, pos, INT_MIN, INT_MAX);        
    }
private:
    // 把值都放进去
    void serialize(TreeNode* root, string& s){
        if(!root) return;
        // const char* 和string的转换
        // const char* ->string 直接赋值即可
        // string ->const char* .c_str()
        s.append(reinterpret_cast<const char*>(&root->val), sizeof(root->val));
        serialize(root->left, s);
        serialize(root->right, s);
    }

    // pos: 遍历的位置
    // curMin: 最小
    // cueMax: 最大
    // 二叉搜索树的问题: 大小中,等于是可以的
    // 字节和string每个字符的问题。从字符串中怎么进行取值和移位,存数和取数是配套的
    // val的值的范围为什么是在curMin和curMax之间呢.必须啊
    
    TreeNode* deserialize(const string& s, int& pos, int curMin, int curMax){
        if(pos >= s.size()) return nullptr;
        // 取某个位置的值
        int val = *reinterpret_cast<const int*>(s.data() + pos);
        if(val < curMin || val > curMax) return nullptr;
        pos += sizeof(val);
        TreeNode* root = new TreeNode(val);
        root->left = deserialize(s, pos, curMin, val);
        root->right = deserialize(s, pos, val, curMax);
        return root;
    }
};
测试输入输出流+数据存储和查询:
    // 不知道输入输出流是什么特性
    // 由空格来界定,输出了给就有不存在了!
    std::string data = "1 22 13 4 5 6 # 8 # 9";
    std::istringstream in(data);
    std::string val;
    in >> val;
    std::cout <<"1: "<<val << std::endl;
    
    in >> val;
    std::cout <<"2: "<<val << std::endl;

    in >> val;
    std::cout <<"3: "<< val << std::endl;





    // std::string data1 = "12345678910";
    std::string data1;
    int num = 0;
    while (num < 10) {
        // 输入是什么:
        // 目标想把这个num给放进去
        // 
        data1.append(reinterpret_cast<const char*>(&num), sizeof(num));
        num++;
    }
    std::cout <<"data1:"<<data1 << std::endl;
    std::cout <<"data1.size()"<<data1.size() << std::endl;
    int pos = 0;
    while (pos < data1.size()) {
        // 
        int val = *reinterpret_cast<const int*>(data1.data() + pos);
        std::cout <<val <<",";
        std::cout << pos << "  ";
        pos += sizeof(val);    
    }

相关文章

  • 449.serialize-and-deserialize-bs

    问题: 1.不要用考试的心态对待。2.看的时候准备好几个优质答案,减少搜索难度。目前有4个优秀答案可供选择。3.仔...

网友评论

      本文标题:449.serialize-and-deserialize-bs

      本文链接:https://www.haomeiwen.com/subject/uglgzhtx.html