此题虽然标注是困难,但还是不难的一个题。首先要想如何表示节点而不引起歧义,这里的做法是用括号括住每个节点的数值。然后就是正常的bfs编码解码即可。解码时可以先去掉括号,然后处理很简单。
/**
* 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) {
queue<TreeNode*> q;
q.push(root);
string ans = "";
while(!q.empty())
{
auto n = q.front();
q.pop();
if(!n)ans += "(null)";
else
{
string val = to_string(n->val);
ans += "(" + val + ")";
q.push(n->left);
q.push(n->right);
}
}
return ans;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
vector<string> t;
string tmp = "";
for(auto c: data)
{
if(c == ')')
{
t.push_back(tmp);
tmp = "";
}
else if(c != '(')tmp += c;
}
if(t[0] == "null")return nullptr;
TreeNode *root = new TreeNode(stoi(t[0]));
queue<TreeNode*> q;
q.push(root);
int p = 0;
while(p < t.size())
{
auto n = q.front();
q.pop();
p++;
if(p >= t.size())break;
if(t[p] != "null")
{
n->left = new TreeNode(stoi(t[p]));
q.push(n->left);
}
p++;
if(p >= t.size())break;
if(t[p] != "null")
{
n->right = new TreeNode(stoi(t[p]));
q.push(n->right);
}
}
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));