将二叉排序树序列化成字符串,再将序列化后的字符串反序列成二叉排序树。
对二叉排序树序列化只能用先序访问序列化,这里用到StringBuilder,添加空格字符分离每个值;
反序列化使用到队列,当然还有递归,第一个字符肯定是根节点,比根节点小的都是左子树,比根节点大的是右子树,使用队列再次构造左子树,再用剩下的队列构造右子树。
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
helpSerialize(root,sb);
return sb.toString();
}
public void helpSerialize(TreeNode root, StringBuilder sb){
if(root == null)
return;
sb.append(root.val).append(" ");
helpSerialize(root.left,sb);
helpSerialize(root.right,sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.length() == 0) return null;
String[] strs = data.split(" ");
Queue<Integer> queue = new LinkedList<>();
//queue.addAll(Arrays.asList(data.split(" ")));
for(String str:strs){
queue.offer(Integer.parseInt(str));
}
return help(queue);
}
public TreeNode help(Queue<Integer> q) {
if(q.isEmpty()) return null;
int cur = q.poll();
TreeNode root = new TreeNode(cur);
Queue<Integer> sq = new LinkedList<>();
while(!q.isEmpty() && q.peek()<cur){
sq.offer(q.poll());
}
root.left = help(sq);
root.right = help(q);
return root;
}
}
方法参考LeetCode讨论中的一个编友。