前言

二叉树的序列化是指将二叉树转化成一个字符串,便于存储或者通过网络传输。反序列化就是将字符串通过相同的规则转化成二叉树。

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

题目
297. 二叉树的序列化与反序列化

序列化

通过先序遍历存储每个节点,和普通的先序遍历不同的是,需要存储空节点。
序列化的结果如下:

"1,2,#,4,#,#,3,#,#,"

反序列化

一般情况下,不能只通过先序遍历构造出二叉树,而需要先序遍历和中序遍历才能构造二叉树。但是这里情况不一样,因为字符串中包含了空节点,所以可以只通过先序遍历构造出二叉树。

代码

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

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        traverse(root, sb);
        return sb.toString();
    }

    void traverse(TreeNode root, StringBuilder sb){
        if(root == null){
            sb.append(NULL).append(SEP);
            return;
        }
        sb.append(root.val).append(SEP);
        traverse(root.left, sb);
        traverse(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        LinkedList<String> node = new LinkedList<>();
        for(String str : data.split(SEP)){
            node.add(str);
        }
        return build(node);
    }

    TreeNode build(LinkedList<String> node){
        if(node.isEmpty()){
            return null;
        }
        String rootVal = node.removeFirst();
        if(rootVal.equals(NULL)){
            return null;
        }
        TreeNode root = new TreeNode(Integer.parseInt(rootVal));

        root.left = build(node);
        root.right = build(node);

        return root;
    }
}

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