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) {
        StringBuilder stringBuilder = new StringBuilder();
        Queue<TreeNode> queue = new LinkedList<>();
        Queue<String> queueString = new LinkedList<>();
        if (root == null) {
            return "{}";
        }
        queue.add(root);
        queueString.add(root.val + "");
        stringBuilder.append("{");
        while (!queue.isEmpty()) {
            Queue<TreeNode> tempQueue = new LinkedList<>();
            Queue<String> tempQueueString = new LinkedList<>();
            while (queueString.peek().equals("#")) {
                stringBuilder.append(queueString.poll()).append(",");
            }
            if (queue.peek().left != null) {
                tempQueue.add(queue.peek().left);
                tempQueueString.add(queue.peek().left.val + "");
            }
            if (queue.peek().left == null) {
                tempQueueString.add("#");
            }
            if (queue.peek().right != null) {
                tempQueue.add(queue.peek().right);
                tempQueueString.add(queue.peek().right.val + "");
            }
            if (queue.peek().right == null) {
                tempQueueString.add("#");
            }
            stringBuilder.append(queueString.poll()).append(",");
            queue.poll();
            while (!tempQueue.isEmpty()) {
                queue.add(tempQueue.poll());
            }
            while (!tempQueueString.isEmpty()) {
                queueString.add(tempQueueString.poll());
            }
        }
        stringBuilder.deleteCharAt(stringBuilder.length() - 1);
        stringBuilder.append("}");
        return stringBuilder.toString();
    }

    TreeNode Deserialize(String str) {
        str = str.replaceAll("\\{", "");
        str = str.replaceAll("\\}", "");
        if (str.length() == 0) {
            return null;
        }
        String[] split = str.split(",");
        TreeNode root = new TreeNode(Integer.parseInt(split[0]));
        Queue<String> queueString = new LinkedList<>();
        for (String s : split) {
            queueString.add(s);
        }
        queueString.poll();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queueString.isEmpty()) {
            Queue<TreeNode> temp = new LinkedList<>();
            if (!queueString.isEmpty() && !queueString.peek().equals("#")) {
                TreeNode left = new TreeNode(Integer.parseInt(queueString.poll()));
                queue.peek().left = left;
                temp.add(left);
            }
            else if (!queueString.isEmpty() && queueString.peek().equals("#")) {
                queueString.poll();
            }
            if (!queueString.isEmpty() && !queueString.peek().equals("#")) {
                TreeNode right = new TreeNode(Integer.parseInt(queueString.poll()));
                queue.peek().right = right;
                temp.add(right);
            }
            else if (!queueString.isEmpty() && queueString.peek().equals("#")) {
                queueString.poll();
            }
            queue.poll();
            while (!temp.isEmpty()) {
                queue.add(temp.poll());
            }
        }
        return root;
    }
}