Leetcode 297. Serialize and Deserialize Binary Tree 笔记

583 阅读1分钟

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)

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    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);
        }
    }

    // Decodes your encoded data to tree.
    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;
    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));