https://leetcode.com/problems/serialize-and-deserialize-bst/
一般来说serialize和deserialize的要求就是这个数据能够完整且表示唯一的数据结构。有点像充要条件的意思。对于一般的binary tree,充要条件可能为一个preorder的数组和inorder的数组,也可能为一个inorder的数组和一个postorder的数组。我说的其实是下面两题:
https://blog.csdn.net/chaochen1407/article/details/43411599
https://blog.csdn.net/chaochen1407/article/details/43410745
但对于Binary Search Tree来说,充要条件一个preorder就够了。其实整个算法就是serialize重构一个preorder的数组,然后deserialize再通过这个preorder的数组来完成这棵树的重组。deserialize比较直观的做法就是一个个node进行插入,当然,也可以存在更高效的做法。先给出第一段代码:
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder strBlder = new StringBuilder();
dfsSerialize(root, strBlder);
return strBlder.toString();
}
public void dfsSerialize(TreeNode node, StringBuilder strBlder) {
if (node != null) {
strBlder.append(node.val + " ");
dfsSerialize(node.left, strBlder);
dfsSerialize(node.right, strBlder);
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data.equals("")) return null;
String[] nodeVals = data.split(" ");
TreeNode root = null;
for (String nodeVal : nodeVals) {
int val = Integer.parseInt(nodeVal);
TreeNode current = new TreeNode(val);
if (root == null) {
root = current;
} else {
TreeNode tmp = root;
while (tmp != null) {
if (val > tmp.val) {
if (tmp.right != null) {
tmp = tmp.right;
} else {
tmp.right = current;
tmp = null;
}
} else {
if (tmp.left != null) {
tmp = tmp.left;
} else {
tmp.left = current;
tmp = null;
}
}
}
}
}
return root;
}
其实deserialize还存在一个更为高效的做法。就是递归preorder dfs的形式自下而上的重构。
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data.equals("")) return null;
String[] nodeVals = data.split(" ");
Integer[] vals = new Integer[nodeVals.length];
for (int i = 0; i < nodeVals.length; i++) {
vals[i] = Integer.parseInt(nodeVals[i]);
}
TreeNode root = null;
int[] cursor = new int[1];
return dfsDeserialize(vals, cursor, Integer.MAX_VALUE);
}
public TreeNode dfsDeserialize(Integer[] vals, int[] cursor, int rootVal) {
if (cursor[0] == vals.length || vals[cursor[0]] > rootVal) {
return null;
}
TreeNode node = new TreeNode(vals[cursor[0]]);
cursor[0]++;
node.left = dfsDeserialize(vals, cursor, node.val);
node.right = dfsDeserialize(vals, cursor, rootVal);
return node;
}
这段代码的serialize和上面的一样,就不重复了。