leetcode刷题笔记297题 二叉树的序列化与反序列化
问题描述:
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
示例:
你可以将以下二叉树:
1
/
2 3
/
4 5序列化为 "[1,2,3,null,null,4,5]"
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。
/**
* Definition for a binary tree node.
* class TreeNode(var _value: Int) {
* var value: Int = _value
* var left: TreeNode = null
* var right: TreeNode = null
* }
*/
class Codec {
//使用ListBuffer 存储先序遍历结果
val path = scala.collection.mutable.ListBuffer[String]()
// Encodes a list of strings to a single string.
def serialize(root: TreeNode): String = {
dfs_s(root)
//println(path.mkString)
return path.mkString
}
def dfs_s(root: TreeNode): Unit = {
if (root == null) path.append("#,")
else {
path.append((root.value).toString+",")
dfs_s(root.left)
dfs_s(root.right)
}
}
// Decodes a single string to a list of strings.
def deserialize(data: String): TreeNode = {
//使用 U 标记位置
var u = 0
return dfs_d(data)
def dfs_d(data: String): TreeNode = {
if (data(u) == '#') {
u += 2
return null
}
else {
val k = u
while (data(u) != ',') u += 1
//println("u: " + u + ", k: " + k)
//println(data.substring(k, u))
val root = new TreeNode(data.substring(k, u).toInt)
u += 1
//println("u: " + u + ", data(u): " + data(u))
root.left = dfs_d(data)
root.right = dfs_d(data)
return root
}
}
return dfs_d(data)
}
}
/**
* Your Codec object will be instantiated and called as such:
* var ser = new Codec()
* var deser = new Codec()
* val s = ser.serialize(root)
* val ans = deser.deserialize(s)
*/