File tree Expand file tree Collapse file tree 2 files changed +139
-0
lines changed
lcof2/剑指 Offer II 048. 序列化与反序列化二叉树 Expand file tree Collapse file tree 2 files changed +139
-0
lines changed Original file line number Diff line number Diff line change @@ -314,6 +314,78 @@ const rdeserialize = dataList => {
314
314
*/
315
315
```
316
316
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
+
317
389
<!-- tabs:end -->
318
390
319
391
<!-- solution:end -->
Original file line number Diff line number Diff line change
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
+ */
You can’t perform that action at this time.
0 commit comments