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 {
TreeNode nullNode = new TreeNode(-1);
String Serialize(TreeNode root) {
if(root == null){
return "";
}
StringBuilder sb = new StringBuilder();
Deque<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
root = queue.poll();
sb.append(root.val+"!");
if(root!=nullNode){
if(root.left!=null){
queue.add(root.left);
}else{
queue.add(nullNode);
}
if(root.right!=null){
queue.add(root.right);
}else{
queue.add(nullNode);
}
}
}
return sb.toString();
}
TreeNode Deserialize(String str) {
if("".equals(str)){
return null;
}
String[] vals = str.split("!");
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
Deque<TreeNode> queue = new LinkedList<>();
queue.offer(root);
for(int i = 1; i < vals.length; i+=2){
TreeNode node = queue.poll();
int left = Integer.parseInt(vals[i]);
int right = Integer.parseInt(vals[i+1]);
if(left!=-1){
node.left = new TreeNode(left);
queue.add(node.left);
}
if(right!=-1){
node.right = new TreeNode(right);
queue.add(node.right);
}
}
return root;
}
}