题目分析
题目链接:449. 序列化和反序列化二叉搜索树
觉得序列化很简单,前序遍历、后序遍历、中序遍历、层序遍历等等。其中得到前序遍历和后序遍历是可以通过递归解法反序列化的,觉得这样子做有点复杂。就想着可不可以一次遍历。一次遍历的问题在于不知道哪里子孩子为空(因为没有保存子孩子为空的情况)。所以我就针对性地让空节点的值为-1。为了方便从字符串中读取数字,使用了C++中的istringstream。整体的实现还是比较简洁高效的。
实现代码
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
queue<TreeNode*> q;
string ans;
if (root == nullptr) return ans;
q.push(root);
int cnt;
TreeNode *t;
while (!q.empty()) {
cnt = q.size();
while (cnt--) {
t = q.front(); q.pop();
if (t) {
ans.append(std::to_string(t->val));
q.push(t->left);
q.push(t->right);
} else {
ans.append("-1");
}
ans.push_back(' ');
}
}
return ans;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
std::istringstream is(data);
int x, y, cnt;
TreeNode *root = nullptr, *t;
queue<TreeNode*> q;
if (is >> x) {
root = new TreeNode(x);
q.push(root);
while (!q.empty()) {
cnt = q.size();
while (cnt--) {
t = q.front(); q.pop();
is >> x >> y;
if (x != -1) {
t->left = new TreeNode(x);
q.push(t->left);
}
if (y != -1) {
t->right = new TreeNode(y);
q.push(t->right);
}
}
}
}
return root;
}
};
反思总结
写完后去看了一眼题解才发现是二叉搜索树。。。我眼睛是有多瞎。不过二叉搜索树也没有什么特别好的优化。
如果用的是中序和前序还原的话,由于二叉搜索树中序遍历是有序的性质不用去特意保存中序遍历。