Skip to content

Commit b574ba5

Browse files
authored
feat: add swift implementation to lcof2 problem: No.048 (doocs#3063)
1 parent c588c2c commit b574ba5

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

lcof2/剑指 Offer II 048. 序列化与反序列化二叉树/README.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,78 @@ const rdeserialize = dataList => {
314314
*/
315315
```
316316

317+
#### Swift
318+
319+
```swift
320+
/* class TreeNode {
321+
* var val: Int
322+
* var left: TreeNode?
323+
* var right: TreeNode?
324+
* init() {
325+
* self.val = 0
326+
* self.left = nil
327+
* self.right = nil
328+
* }
329+
* init(_ val: Int) {
330+
* self.val = val
331+
* self.left = nil
332+
* self.right = nil
333+
* }
334+
* init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
335+
* self.val = val
336+
* self.left = left
337+
* self.right = right
338+
* }
339+
* }
340+
*/
341+
342+
class Codec {
343+
private let NULL = "#"
344+
private let SEP = ","
345+
346+
func serialize(_ root: TreeNode?) -> String {
347+
guard let root = root else { return "" }
348+
var sb = ""
349+
preorder(root, &sb)
350+
return sb
351+
}
352+
353+
private func preorder(_ root: TreeNode?, _ sb: inout String) {
354+
guard let root = root else {
355+
sb += NULL + SEP
356+
return
357+
}
358+
sb += "\(root.val)" + SEP
359+
preorder(root.left, &sb)
360+
preorder(root.right, &sb)
361+
}
362+
363+
func deserialize(_ data: String) -> TreeNode? {
364+
guard !data.isEmpty else { return nil }
365+
var vals = data.split(separator: Character(SEP)).map { String($0) }
366+
return deserialize(&vals)
367+
}
368+
369+
private func deserialize(_ vals: inout [String]) -> TreeNode? {
370+
if vals.isEmpty { return nil }
371+
let first = vals.removeFirst()
372+
if first == NULL {
373+
return nil
374+
}
375+
let root = TreeNode(Int(first)!)
376+
root.left = deserialize(&vals)
377+
root.right = deserialize(&vals)
378+
return root
379+
}
380+
}
381+
/**
382+
* Your functions will be called as such:
383+
* let codec = Codec()
384+
* let serializedDatacodec.serialize(root);
385+
* codec.deserialize(serializedData);
386+
*/
387+
```
388+
317389
<!-- tabs:end -->
318390

319391
<!-- solution:end -->
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/* class TreeNode {
2+
* var val: Int
3+
* var left: TreeNode?
4+
* var right: TreeNode?
5+
* init() {
6+
* self.val = 0
7+
* self.left = nil
8+
* self.right = nil
9+
* }
10+
* init(_ val: Int) {
11+
* self.val = val
12+
* self.left = nil
13+
* self.right = nil
14+
* }
15+
* init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
16+
* self.val = val
17+
* self.left = left
18+
* self.right = right
19+
* }
20+
* }
21+
*/
22+
23+
class Codec {
24+
private let NULL = "#"
25+
private let SEP = ","
26+
27+
func serialize(_ root: TreeNode?) -> String {
28+
guard let root = root else { return "" }
29+
var sb = ""
30+
preorder(root, &sb)
31+
return sb
32+
}
33+
34+
private func preorder(_ root: TreeNode?, _ sb: inout String) {
35+
guard let root = root else {
36+
sb += NULL + SEP
37+
return
38+
}
39+
sb += "\(root.val)" + SEP
40+
preorder(root.left, &sb)
41+
preorder(root.right, &sb)
42+
}
43+
44+
func deserialize(_ data: String) -> TreeNode? {
45+
guard !data.isEmpty else { return nil }
46+
var vals = data.split(separator: Character(SEP)).map { String($0) }
47+
return deserialize(&vals)
48+
}
49+
50+
private func deserialize(_ vals: inout [String]) -> TreeNode? {
51+
if vals.isEmpty { return nil }
52+
let first = vals.removeFirst()
53+
if first == NULL {
54+
return nil
55+
}
56+
let root = TreeNode(Int(first)!)
57+
root.left = deserialize(&vals)
58+
root.right = deserialize(&vals)
59+
return root
60+
}
61+
}
62+
/**
63+
* Your functions will be called as such:
64+
* let codec = Codec()
65+
* let serializedDatacodec.serialize(root);
66+
* codec.deserialize(serializedData);
67+
*/

0 commit comments

Comments
 (0)