跳到主要内容

297 二叉树的序列化与反序列化

https://leetcode.cn/leetbook/read/top-interview-questions-medium/xwxa3m/

cost:

/**
* 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) {
if (root == nullptr) {
return ",null";
}
string s = "," + to_string(root->val);
s += this->serialize(root->left);
s += this->serialize(root->right);
return s;
}

// Decodes your encoded data to tree.
TreeNode* deserialize(string s) {
int idx = 0;
return this->deserialize(s, idx);
}

private:
TreeNode* deserialize(string& s, int& idx) {
auto node = this->parseTreeNode(s, idx);
if (node == nullptr) {
return nullptr;
}
node->left = this->deserialize(s, idx);
node->right = this->deserialize(s, idx);
return node;
}

TreeNode* parseTreeNode(string& s, int& idx) {
bool valid = false;
int r = 0;
bool positive = true;
while (idx < s.size()) {
if (s[idx] == ',') {
idx++;
continue;
}
if (s[idx] == 'n') {
idx += 4;
return nullptr;
}
valid = true;
if (s[idx] == '-') {
positive = false;
idx++;
continue;
}
while (idx < s.size() && s[idx] >= '0' && s[idx] <= '9') {
r *= 10;
r += s[idx] - '0';
idx++;
}
break;
}
if (!valid) {
return nullptr;
}
if (!positive) {
r = -r;
}
return new TreeNode(r);
}
};

// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));