题目描述
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
案例
实现
1.序列化可以参考上一篇二叉树的递归、非递归遍历,只不过在本题中,二叉树的非递归遍历中,树的节点入栈是只要节点非空,左右子树都入栈。
2.反序列化用递归实现,后面改进,争取用非递归来实现。
代码
/**
* 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 str;
if(root == NULL)
{
str += "null,";
}
else
{
stack<TreeNode*>st;
st.push(root);
while(!st.empty())
{
root = st.top();
st.pop();
if(root)
{
//str += str + to_string(root->val) + "," ;//在字符串中
str.append(to_string(root->val));
str.append(",");
st.push(root->right);
st.push(root->left);
}
else
{
str += "null,";
}
}
}
return str;
}
// Decodes your encoded data to tree.
//树的先序遍历(字符串)转换为树的结构
TreeNode* rdeserialize(queue<string>& que) {
if (que.front() == "null") {
que.pop();
return nullptr;
}
TreeNode* root = new TreeNode(std::stoi(que.front()));
que.pop();
root->left = rdeserialize(que);
root->right = rdeserialize(que);
return root;
}
TreeNode* deserialize(string data) {
queue<string> que;
string str;
//data为字符串类型,二叉树的每一个节点的值之间用","隔开,所以在这一步必须使得data中的","消失
for (auto& ch : data) {
if (ch == ',') {
que.push(str);
str.clear();
} else {
str.push_back(ch);
}
}
if (!str.empty()) {
que.push(str);
str.clear();
}
return rdeserialize(que);
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));