Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.
For example, you may serialize the following tree
1 / \ 2 3 / \ 4 5as
"[1,2,3,null,null,4,5]"
, just the same as
how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
序列化比较好写,就是前序遍历,不过要记录下空节点。用”,“分割数字。反序列化的非递归,鼓捣很久呀。递归应该好写一些。
/**
* 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) {
string result;
if (root == nullptr) {
return result;
}
stack<TreeNode*> nodes;
while (root != nullptr || !nodes.empty()) {
while (root != nullptr) {
result += to_string(root->val) + ",";
nodes.push(root);
root = root->left;
}
result += ",";
if (!nodes.empty()) {
root = nodes.top();
nodes.pop();
root = root->right;
}
}
return result;
}
bool getNumber(const string& data, int& val, int& pos) {
int startPos = pos;
bool negative = false;
if (data[pos] == '-') {
negative = true;
++pos;
}
val = 0;
while (pos < data.size() && data[pos] != ',') {
val = val * 10 + (data[pos] - '0');
++pos;
}
if (negative) {
val = -val;
}
return (startPos != pos);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
TreeNode* root = nullptr;
TreeNode* prev = nullptr;
stack<TreeNode*> nodes;
int i = 0;
while (i < data.size()) {
int val = 0;
int j = i;
if (getNumber(data, val, j)) {
TreeNode* cur = new TreeNode(val);
if (root == nullptr) {
root = prev = cur;
nodes.push(cur);
}
else {
if (prev == nullptr) {
prev = nodes.top();
nodes.pop();
prev->right = cur;
}
else {
prev->left = cur;
}
nodes.push(cur);
prev = cur;
}
}
else {
if (prev == nullptr) {
nodes.pop();
}
else {
prev = nullptr;
}
}
i = j + 1;
}
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
递归解法,相对简单些。
/**
* 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) {
string result;
if (root == nullptr) {
return result;
}
stack<TreeNode*> nodes;
while (root != nullptr || !nodes.empty()) {
while (root != nullptr) {
result += to_string(root->val) + ",";
nodes.push(root);
root = root->left;
}
result += ",";
if (!nodes.empty()) {
root = nodes.top();
nodes.pop();
root = root->right;
}
}
return result;
}
bool getNumber(const string& data, int& val, int& pos) {
int startPos = pos;
bool negative = false;
if (data[pos] == '-') {
negative = true;
++pos;
}
val = 0;
while (pos < data.size() && data[pos] != ',') {
val = val * 10 + (data[pos] - '0');
++pos;
}
if (negative) {
val = -val;
}
++pos;
return (startPos + 1 != pos);
}
TreeNode* deserializeHelper(const string& data, int& start) {
TreeNode* root = nullptr;
int val = 0;
bool isNum = getNumber(data, val, start);
if (isNum) {
root = new TreeNode(val);
root->left = deserializeHelper(data, start);
root->right = deserializeHelper(data, start);
}
return root;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int start = 0;
return deserializeHelper(data, start);
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));