Hard
过程
- Serialize
- 树 -> 字符串
- 遍历树, DFS, 规定顺序, 工具: StringBuilder, 返回sb.toString()
- 记得添加分隔符, 为了反序列化时分辨元素
- dfs base case: root == null
- DeSerialize
- 先通过分隔符做data.split, String[] str = str.split(",");
- 再将Srting array放到queue里,Collections.addAll(queue, str),Collections是一个工具类, addAll()方法用来将一组元素添加到一个集合中。
- 为什么是queue?
- 我认为是为了当dequeue建树的时候,出来元素的顺序刚好正确
- 注意queue的顺序
- 每次poll出来的元素先检查是否是#, 然后转化成int型, Integer.parseInt(s)
代码
public class Codec {
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
buildString(root, sb);
return sb.toString();
}
public void buildString(TreeNode root, StringBuilder sb){
if(root == null)
sb.append("#").append(",");
else{
sb.append(root.val).append(",");
buildString(root.left, sb);
buildString(root.right, sb);
}
}
public TreeNode deserialize(String data) {
if(data == null) return null;
String[] str = data.split(",");
Queue<String> q = new LinkedList<>();
Collections.addAll(q, str);
return buildTree(q);
}
public TreeNode buildTree(Queue<String> q){
if(q.isEmpty())
return null;
String s = q.poll();
if(s.equals("#"))
return null;
TreeNode node = new TreeNode(Integer.parseInt(s));
node.left = buildTree(q);
node.right = buildTree(q);
return node;
}
}