import java.util.*;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {

    // 二叉树的先序序列化
    String Serialize(TreeNode root) {
        // 算法的时间复杂度O(N),额外空间复杂度O(N)

        // 1.创建StringJoiner,方便格式化拼接序列化字符串
        StringJoiner sj = new StringJoiner(",", "{", "}");

        // 2.调用先序递归函数序列化二叉树
        SerializeProcess(root, sj);
        System.out.println(sj.toString());
        return sj.toString();
    }

    // 先序序列化的递归过程
    public void SerializeProcess(TreeNode root, StringJoiner sj) {
        // 递归出口
        if (root == null) {
            sj.add("#");
            return;
        }
        // 先序 - 先写入当前结点
        sj.add(Integer.toString(root.val));
        // 先序 - 后解决左右子树
        SerializeProcess(root.left, sj);
        SerializeProcess(root.right, sj);
    }

    // 二叉树的先序反序列化
    TreeNode Deserialize(String str) {
        // 1.处理字符串的前缀和后缀,并以,分割
        String prefix = "{";
        String suffix = "}";
        str = str.substring(prefix.length());
        str = str.substring(0, str.length() - suffix.length());
        String[] strs = str.split(",");

        // 2.根据处理后的字符串数组构造队列
        Queue<String> queue = new LinkedList<>();
        for (String s: strs) {
            queue.add(s);
        }

        // 3.调用递归函数反序列化二叉树
        return DeserializeProcess(queue);
    }

    // 先序反序列化的递归过程
    public TreeNode DeserializeProcess(Queue<String> queue) {
        String val = queue.poll();
        if (val == null || "#".equals(val)) {
            // 如果遇到#,表示该结点为空
            return null;
        }
        // 先序 - 新建结点
        TreeNode cur = new TreeNode(Integer.valueOf(val));
        // 先序 - 解决左右子树
        cur.left = DeserializeProcess(queue);
        cur.right = DeserializeProcess(queue);
        // 先序 - 返回本结点
        return cur;
    }
}