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

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 
 * @param root TreeNode类 
 * @return TreeNode类
*/
// 序列化:前序遍历
func Serialize( root *TreeNode ) string {
    res := strings.Builder{}
    var preOrder func(node *TreeNode)
    preOrder = func(node *TreeNode) {
        if node == nil {
            res.WriteString("nil,")
            return
        }
        res.WriteString(strconv.Itoa(node.Val) + ",")
        preOrder(node.Left)
        preOrder(node.Right)
    }
    preOrder(root)
    return res.String()
}

// 反序列化:前序遍历解码
func Deserialize( s string ) *TreeNode {
    str := strings.Split(s, ",")
	if len(str) == 0{
        return &TreeNode{}
    }
    var preOrder func() *TreeNode
    preOrder = func() *TreeNode {
        if str[0] == "nil" {
            str = str[1:]
            return nil
        }
        val, _ :=  strconv.Atoi(str[0])
        str = str[1:]
        root := &TreeNode{Val: val}
        root.Left = preOrder()
        root.Right = preOrder()
        return root
    }
    return preOrder()
}