297. 二叉树的序列化与反序列化(Serialize and Deserialize Binary Tree)
题目描述:
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
解题思路:
这道题的方法很多,我使用的是先序遍历,并且用‘,’分割不同结点。如果遇到空结点就用null的首字母‘n’表示。解码时先解析字符串到一个数组中,然后同样先序遍历的顺序重新构建二叉树。
代码如下:
/** * 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. void en_dfs(TreeNode* p, string& res) { if (!p) { res.append("n,"); return ; } res.append(to_string(p->val)).append(","); en_dfs(p->left, res); en_dfs(p->right, res); } string serialize(TreeNode* root) { string res; en_dfs(root, res); return res; } // Decodes your encoded data to tree. void de_dfs(TreeNode*& p, int& i, vector<int>& number) { if (number[i] == numeric_limits<int>::max()) { p = nullptr; return ; } p = new TreeNode(number[i]); de_dfs(p->left, ++i, number); de_dfs(p->right, ++i, number); } TreeNode* deserialize(string data) { TreeNode* root = nullptr; vector<int> number; int i = 0; while (i != data.size()) { int j = data.find(',', i); string s = data.substr(i, j - i); if (s == "n") number.push_back(numeric_limits<int>::max()); else number.push_back(stoi(s)); i = j + 1; } i = 0; de_dfs(root, i, number); return root; } }; // Your Codec object will be instantiated and called as such: // Codec codec; // codec.deserialize(codec.serialize(root));