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 {
    private String res="";
    private int index = 0;
    //写一份辅助的递归函数(序列化)
    void Serialize_help(TreeNode root) {
        //判断当前节点是否为空?如果为空,将null加入到res中
        if (root == null) {
            //继续判断res是否为空,如果为空,直接加入
            if (res.length()==0) {
                res += "#";
                return;
            }
            //如果res不为空,前面填逗号
            else {
                res += ",#";
                return;
            }
        }
        //当前节点不为空,将节点值加入到res中
        else {
            //再次判断res中是否为空!
            if (res.length()==0) {
                res += root.val;
            }
            else{
                res+=",";
                res+=root.val;
            }
        }
        //先序遍历,中左右
        Serialize_help(root.left);
        Serialize_help(root.right);
    }
    String Serialize(TreeNode root) {
        Serialize_help(root);
        return res;
    }
    TreeNode Deserialize(String str) {
        //用一个数组存放序列化的字符串
        ArrayList<String> nodes = new ArrayList<>();
        //将字符串按照逗号拆分
        String[] str1 = str.split(",");
        for(int i=0;i<str1.length;i++){
            nodes.add(str1[i]);
        }
        return Deserialize_help(nodes);
    }
    TreeNode Deserialize_help(ArrayList<String> nodes){
        //这里的equals是个坑!!!!!
        if(nodes.get(index).equals("#")){
            index++;
            return null; 
        }
        //不为空则取出当前的数组数据,创建对应节点
        TreeNode node = new TreeNode(Integer.parseInt(nodes.get(index)));
        index++;
        //递归创建左子树和右子树
        node.left = Deserialize_help(nodes);
        node.right = Deserialize_help(nodes);
        return node;
    }
}