Description
Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary search tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary search tree can be serialized to a string and this string can be deserialized to the original tree structure.
The encoded string should be as compact as possible.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
问题描述
对二叉排序树进行序列化和反序列化
注意, 不要使用成员变量, 全局变量, 静态变量来保存状态。
问题分析
使用前序遍历进行序列化
在反序列化的过程中, 注意上界和下界
解法1
public class Codec {
private static final String spliter = ",";
// Encodes a tree to a single string.
public String serialize(TreeNode root){
if(root == null) return null;
StringBuilder sb = new StringBuilder();
preorder(root, sb);
return sb.toString();
}
private void preorder(TreeNode root, StringBuilder sb){
if(root == null) return;
sb.append(root.val).append(spliter);
preorder(root.left, sb);
preorder(root.right, sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data){
if(data == null || data.length() == 0) return null;
String[] sa = data.split(spliter);
int[] index = new int[]{0};
return helper(sa, index, Long.MIN_VALUE, Long.MAX_VALUE);
}
// construct BST from preorder order traversal;
private TreeNode helper(String[] sa, int[] index, long min, long max){
if(index[0] >= sa.length) return null;
TreeNode root = null;
int rootValue = Integer.parseInt(sa[index[0]]);
if(rootValue > min && rootValue < max){
root = new TreeNode(rootValue);
index[0]++;
root.left = helper(sa, index, min, rootValue);
root.right = helper(sa, index, rootValue, max);
}
return root;
}
}
解法2
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
serializeHelper(sb, root);
return sb.toString();
}
private void serializeHelper(StringBuilder sb, TreeNode root) {
if(root == null) return;
sb.append((char)root.val);
serializeHelper(sb, root.left);
serializeHelper(sb, root.right);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
Queue<Character> queue = new LinkedList();
for(Character ch: data.toCharArray()) queue.offer(ch);
return deserializeHelper(queue, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private TreeNode deserializeHelper(Queue<Character> queue, int min, int max) {
if(queue.isEmpty() || Integer.valueOf(queue.peek()) >= max) return null;
int val = Integer.valueOf(queue.poll());
TreeNode root = new TreeNode(val);
root.left = deserializeHelper(queue, min, val);
root.right = deserializeHelper(queue, val, max);
return root;
}
}