package main
import (
    "strconv"
    "fmt"
    "strings"
)
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param root TreeNode类 
 * @return TreeNode类
*/


func Serialize(root *TreeNode) string {
    node := root
	res := strings.Builder{}
	var pre func(node *TreeNode)
	pre = func(node *TreeNode) {
		if node == nil {
			res.WriteString("#,")
			return
		}
		res.WriteString(fmt.Sprintf("%v,", node.Val))
		pre(node.Left)
		pre(node.Right)
	}
	pre(node)
	return res.String()
}

func Deserialize(s string) *TreeNode {
    str := s
	if len(str) == 0 {
		return nil
	}
	arr := strings.Split(str, ",")
	var build func() *TreeNode
	build = func() *TreeNode {
		if arr[0] == "#" {
			arr = arr[1:]
			return nil
		}
		ele, _ := strconv.Atoi(arr[0])
		arr = arr[1:]
		node := &TreeNode{Val: ele}
		node.Left = build()
		node.Right = build()
		return node
	}
	return build()
}