import java.util.ArrayList;
import java.util.List;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    private int desIndex = 0; // 记录当前反序列化的下标
    String Serialize(TreeNode root) {
        List<String> result = new ArrayList<>();
        if(root==null) return "{}";
        ser(root, result);
        return "{"+String.join(",", result)+"}";
    }

    /**
     * 序列化
     * @param node 当前序列化节点
     * @param result 序列化结果集
     */
    void ser(TreeNode node, List<String> result){
        if(node==null){ // 当前节点是空节点
            result.add("#");
            return;
        }
        result.add(String.valueOf(node.val));
        ser(node.left, result); // 序列化左子节点
        ser(node.right, result);// 序列化右子节点
    }

    TreeNode Deserialize(String str) {
        str = str.substring(1, str.length()-1); // 去除两边{}
        if(str.isEmpty()) return null;
        String[] nodes = str.split(","); // 按逗号分割
        return des(nodes);
    }

    /**
     * 继续反序列化节点
     * @param nodes 节点列表
     * @return 节点
     */
    TreeNode des(String[] nodes){
        String s = nodes[desIndex++]; // 获取当前节点数值
        if(s.equals("#")) return null; // #代表为空节点
        TreeNode cur = new TreeNode(Integer.parseInt(s)); // 生成节点
        cur.left = des(nodes); // 反序列化左节点
        cur.right = des(nodes); // 反序列化右节点
        return cur;
    }
}