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));
posted @ 2020-06-16 09:43  菁芜  阅读(153)  评论(0编辑  收藏  举报