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;
}
}