「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
Hi 👋
- Wechat: RyukieW
- 微信公众号:LabLawliet
- 📦 技术文章归档
- 🐙 Github
我的个人项目 | 扫雷Elic 无尽天梯 | 梦见账本 | 隐私访问记录 |
---|---|---|---|
类型 | 游戏 | 财务 | 工具 |
AppStore | Elic | Umemi | 隐私访问记录 |
一、 题目
本题官方没有 Swift 用例。本体难度为困难。
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 序列化二叉树的格式 。 你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
链接:leetcode-cn.com/problems/xu…
二、 分析
凭空想象是很难想到解决办法,我们用例子就很容易找到规律了。本题和 【剑指Offer-Swift】32-I.从上到下打印二叉树 较为相似。
编码
的解题基本思路是逐层扫描。可采用辅助队列进行解决。
解码
的思路和 编码
相似,除了辅助队列,我们还需要额外一个指针进行辅助。
三、 代码
3.1 编码
func serialize(root: TreeNode) -> String {
var result = ""
var queue: [TreeNode?] = [root]
while queue.isEmpty == false {
if let first = queue.first, let node = first {
result.append((result.isEmpty ? "\(node.val)" : ",\(node.val)"))
queue.append(node.left)
queue.append(node.right)
}
else {
result.append(",null")
}
queue.removeFirst()
}
return result
}
3.2 解码
func deserialize(data: String) -> TreeNode? {
let array: [String] = data.components(separatedBy: ",")
var nodes: [TreeNode?] = []
array.forEach { item in
if let v = Int(item) {
nodes.append(TreeNode(v))
}
else {
nodes.append(nil)
}
}
if nodes.isEmpty == true { return nil }
var queue: [TreeNode] = []
var index = 0
if let f = nodes.first, let n = f {
queue.append(n)
}
while queue.isEmpty == false {
if let node = queue.first, index + 1 < nodes.count, index + 2 < nodes.count {
node.left = nodes[index + 1]
node.right = nodes[index + 2]
if let l = node.left {
queue.append(l)
}
if let r = node.right {
queue.append(r)
}
index += 2
}
queue.removeFirst()
}
return nodes.first ?? nil
}
3.3 测试用例
let root1 = TreeNode(1)
let root2 = TreeNode(2)
let root3 = TreeNode(3)
let root4 = TreeNode(4)
let root5 = TreeNode(5)
root1.left = root2
root1.right = root3
root3.left = root4
root3.right = root5
// 编码
let s1 = serialize(root: root1)
// 解码
let node = deserialize(data: s1)
// 再编码验证
if let n = node {
serialize(root: n)
}