一、背景介绍
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 “[1,2,3,null,null,4,5]”
二、思路简述
树的表示方法有四种,分别为前序、中序、后序、层序,本文背景中选用的是层序。不管是何种顺序,总体原理都是一样的,只是具体的实现细节稍有不同。
本文选用的层次遍历,采用队列实现,因为其先进先出的特性,可以实现对如下一颗简单二叉树的顺序访问——1,2,3。将其按顺序放入队列中,就可。
1
/ \
2 3
第一步序列化起始就是层次遍历,按照层序依次将树的结点转换成字符串即可。
第二步反序列化,即将字符串中的数组按序取出,并仍按照层序还原二叉树,虽然是反序列,但仍可以将其理解成对一颗空二叉树框“模”的遍历。所以归根结底仍然是遍历,只需在遍历到的位置填上值。当然这是抽象的思维,具体的思维仍是需要根据序列化后的字符串来动态生成二叉树,生成的方法就是依靠队列,通过不停的访问字符串的结点信息,判断是否为空,来动态生成结点。
三、代码示例
#include <string>
#include <stack>
#include <queue>
using namespace std;
#define NULL nullptr
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)
{
string result;
queue<TreeNode*> queueTree;
queueTree.push(root);
while (queueTree.size() != 0)
{
TreeNode* temp = queueTree.front();
queueTree.pop();
if (temp != NULL)
{
if (temp->left != NULL)