• LeetCode 每日一题 297. 二叉树的序列化与反序列化


    题目描述

    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

    请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

    示例:

    你可以将以下二叉树:

    1
    

    /
    2 3
    /
    4 5

    序列化为 "[1,2,3,null,null,4,5]"
    提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

    说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    简单点的话, 二叉树用数组存储就是了,但树劣化成链的时候数组会达到 (2^{depth}) , 内存占用太大。

    所以,这里使用中序遍历,将子树用 () 括起来,即一对对应的 () 就是一棵树。

    #include <bits/stdc++.h>
    
    using namespace std;
    
    /**
     * 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) {
        if(root == nullptr) {
          return "(X)";
        }
        return "(" + serialize(root->left) + to_string(root->val) + serialize(root->right) + ")";
      }
    
      TreeNode* parse(const string data, int& ptr) {
        ptr++; // '(' of current tree
        if(data[ptr] == 'X') {
          ptr += 2;
          return nullptr;
        }
        auto cur = new TreeNode(0);
        cur->left = parse(data, ptr);
        cur->val = atoi(data.c_str() + ptr);
        while(isdigit(data[ptr]) || data[ptr] == '+' || data[ptr] == '-')
          ptr++;
        cur->right = parse(data, ptr);
        ptr++; // ')' of current tree
        return cur;
      }
    
      // Decodes your encoded data to tree.
      TreeNode* deserialize(string data) {
        int ptr(0);
        return parse(data, ptr);
      }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
    
  • 相关阅读:
    MyBatis3: There is no getter for property named 'code' in 'class java.lang.String'
    jQuery获取Select选择的Text和 Value(转)
    mybatis3 :insert返回插入的主键(selectKey)
    【转】Mybatis/Ibatis,数据库操作的返回值
    Android问题-打开DelphiXE8与DelphiXE10编译空工程提示“[Exec Error] The command exited with code 1.”
    Android问题-打开DelphiXE8与DelphiXE10新建一个空工程提示"out of memory"
    BAT-使用BAT生成快捷方式
    给 TTreeView 添加复选框
    跨进程发送消息数据
    鼠标拖动虚影效果
  • 原文地址:https://www.cnblogs.com/Forgenvueory/p/13139322.html
Copyright © 2020-2023  润新知