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) {
        if (root == null) return "#";

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        StringJoiner stringJoiner = new StringJoiner(",");
        stringJoiner.add(String.valueOf(root.val));

        while (!queue.isEmpty()) {
            TreeNode temp = queue.poll();
            if (temp.left != null) {
                queue.offer(temp.left);
                stringJoiner.add(String.valueOf(temp.left.val));
            } else {
                stringJoiner.add("#");
            }
            if (temp.right != null) {
                queue.offer(temp.right);
                stringJoiner.add(String.valueOf(temp.right.val));
            } else {
                stringJoiner.add("#");
            }
        }

        return stringJoiner.toString();
    }

    TreeNode Deserialize(String str) {

        if(str.equals("#")) return null;
        String[] arr = str.split(",");
        Queue<TreeNode> queue = new LinkedList<>();

        TreeNode root = new TreeNode(Integer.parseInt(arr[0]));
        queue.offer(root);
        int arrLength = arr.length;
        int index = 0;
        while (!queue.isEmpty() && index < arrLength - 2) {
            TreeNode temp = queue.poll();
            index++;
            if (!"#".equals(arr[index])) {
                TreeNode left = new TreeNode(Integer.parseInt(arr[index]));
                temp.left = left;
                queue.offer(left);
            }
            index++;
            if (!"#".equals(arr[index])) {
                TreeNode right = new TreeNode(Integer.parseInt(arr[index]));
                temp.right = right;
                queue.offer(right);
            }
        }
        return root;
    }

}