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