核心概念: 前序遍歷 + Null 標記
class TreeNode(var `val`: Int) {
    var left: TreeNode? = null
    var right: TreeNode? = null
}
class Codec {
    // Encodes a tree to a single string.
    fun serialize(root: TreeNode?): String {
        val sb = StringBuilder()
        fun dfs(node: TreeNode?) {
            if (node == null) {
                sb.append("null,")
                return
            }
            sb.append("${node.`val`},")
            dfs(node.left)
            dfs(node.right)
        }
        dfs(root)
        return sb.toString()
    }
    // Decodes your encoded data to tree.
    fun deserialize(data: String): TreeNode? {
        val nodes = ArrayDeque(data.split(","))
        fun dfs(): TreeNode? {
            val value = nodes.removeFirst()
            if (value == "null" || value.isEmpty()) return null
            val node = TreeNode(value.toInt())
            node.left = dfs()
            node.right = dfs()
            return node
        }
        return dfs()
    }
}