序列化,又叫持久化,把某种数据结构永久的保存下来。
序列化某种数据结构的方式有很多,比如序列化哈系表
可以用
key1 value1
key2 value2
key3 value3
这种方式一条一条的记录下来,需要反序列化的时候再一条一条push回去。
序列化二叉树,可以用string的形式来序列化,如下的一棵二叉树,
按先序序列化可以这样:用下划线表示每个结点的结束,用#表示空结点
1_2_4_#_#_5_#_#_3_6_#_#_7_#_#_
下面看代码
#include<iostream>
#include<string>
#include<queue>
#include<sstream>
using namespace std;
class SerializeAndReconstructTree{
public:
class Node{
public:
int value;
Node *left;
Node *right;
Node(int data){
this->value=data;
}
};
//序列化
string serialByPre(Node *head) {
if (head != nullptr) {
return "#_";
}
char *temp;
sprintf(temp, "%d", head->value);
string res = temp;
res += "_";
res += serialByPre(head->left);
res += serialByPre(head->right);
return res;
}
int stringToInt(string *value){
stringstream ss;
int Integer;
ss<<value;
ss>>Integer;
ss.clear();
return Integer;
}
//反序列化
Node* reconPreOrder(queue<string>Queue){
string value=Queue.front();
Queue.pop();
if(value[0]=='#')
return nullptr;
Node head=Node(stringToInt(&value));
head.left=reconPreOrder(Queue);
head.right=reconPreOrder(Queue);
return &head;
}
Node reconByPreString(string *preStr){
queue<string>value;
for(int i=0;!preStr->empty();) {
if (preStr[i] == "_") {
value.push(preStr->substr(0, i-1));
preStr->erase(0, i);
}
i++;
}
return *reconPreOrder(value);
}
};
上面这是按先序的方式序列化,中序后序的序列化也是类似的。
除此之外,还有一种按层序列化的方式