Skip to content

Commit 074dac2

Browse files
committed
Address comments and update the code to sync up with readme
1 parent 25e6a19 commit 074dac2

File tree

3 files changed

+137
-158
lines changed

3 files changed

+137
-158
lines changed

Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
//: Playground - noun: a place where people can play
22

3-
4-
func printTree(_ root: TreeNode?) {
3+
func printTree(_ root: BinaryNode<String>?) {
54
guard let root = root else {
65
return
76
}
87

9-
var pointer = root
10-
118
let leftVal = root.left == nil ? "nil" : root.left!.val
129
let rightVal = root.right == nil ? "nil" : root.right!.val
1310

@@ -17,25 +14,25 @@ func printTree(_ root: TreeNode?) {
1714
printTree(root.right)
1815
}
1916

20-
let s = EncodeAndDecodeTree()
17+
let coder = BinaryNodeCoder<String>()
2118

22-
let node1 = TreeNode("a")
23-
let node2 = TreeNode("b")
24-
let node3 = TreeNode("c")
25-
let node4 = TreeNode("d")
26-
let node5 = TreeNode("e")
19+
let node1 = BinaryNode("a")
20+
let node2 = BinaryNode("b")
21+
let node3 = BinaryNode("c")
22+
let node4 = BinaryNode("d")
23+
let node5 = BinaryNode("e")
2724

2825
node1.left = node2
2926
node1.right = node3
3027
node3.left = node4
3128
node3.right = node5
3229

33-
let encodeStr = s.encode(node1)
30+
let encodeStr = try coder.encode(node1)
3431
print(encodeStr)
3532
// "a b # # c d # # e # #"
3633

3734

38-
let root = s.decode(encodeStr)
35+
let root: BinaryNode<String> = coder.decode(from: encodeStr)!
3936
print("Tree:")
4037
printTree(root)
4138
/*

Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift

Lines changed: 64 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -8,97 +8,88 @@
88

99
import Foundation
1010

11-
public class TreeNode {
12-
public var val: String
13-
public var left: TreeNode?
14-
public var right: TreeNode?
15-
16-
public init(_ val: String, left: TreeNode? = nil, right: TreeNode? = nil) {
17-
self.val = val
18-
self.left = left
19-
self.right = right
20-
}
11+
protocol BinaryNodeEncoder {
12+
func encode<T>(_ node: BinaryNode<T>?) throws -> String
2113
}
2214

23-
public class EncodeAndDecodeTree {
24-
private var encodeStr = ""
25-
private var ret: [String] = []
15+
protocol BinaryNodeDecoder {
16+
func decode<T>(from string: String) -> BinaryNode<T>?
17+
}
2618

27-
public init() {}
19+
public class BinaryNodeCoder<T: Comparable>: BinaryNodeEncoder, BinaryNodeDecoder {
2820

29-
public func encode(_ root: TreeNode?) -> String {
30-
encodeIt(root)
21+
// MARK: Private
3122

32-
return encodeStr
33-
}
23+
private let separator: Character = ","
24+
private let nilNode = "X"
3425

35-
public func decode(_ data: String) -> TreeNode? {
36-
var s = data
37-
while (s.contains(" ")) {
38-
let index = s.index(of: " ")
39-
let endIndex = s.index(before: index)
40-
let element = s[s.startIndex...endIndex]
41-
ret.append(element)
42-
let range = ClosedRange(uncheckedBounds: (lower: s.startIndex, upper: index))
43-
s.removeSubrange(range)
44-
}
45-
46-
if ret.count == 0 {
47-
return nil
48-
}
49-
50-
var dep = 0
51-
let root = decodeIt(&dep)
52-
53-
return root
26+
private func decode<T>(from array: inout [String]) -> BinaryNode<T>? {
27+
guard !array.isEmpty else {
28+
return nil
5429
}
5530

56-
private func getNode(_ element: String) -> TreeNode? {
57-
if element == "#" {
58-
return nil
59-
}
31+
let value = array.removeLast()
6032

61-
return TreeNode(element)
33+
guard value != nilNode, let val = value as? T else {
34+
return nil
6235
}
6336

64-
private func decodeIt(_ dep: inout Int) -> TreeNode? {
65-
guard let currentNode = getNode(ret[dep]) else {
66-
return nil
67-
}
37+
let node = BinaryNode<T>(val)
38+
node.left = decode(from: &array)
39+
node.right = decode(from: &array)
6840

69-
dep += 1
70-
let left = decodeIt(&dep)
71-
dep += 1
72-
let right = decodeIt(&dep)
41+
return node
42+
}
7343

74-
currentNode.left = left
75-
currentNode.right = right
44+
// MARK: Public
7645

77-
return currentNode
46+
public init() {}
47+
48+
public func encode<T>(_ node: BinaryNode<T>?) throws -> String {
49+
var str = ""
50+
node?.preOrderTraversal { data in
51+
if let data = data {
52+
let string = String(describing: data)
53+
str.append(string)
54+
} else {
55+
str.append(nilNode)
56+
}
57+
str.append(separator)
7858
}
7959

80-
private func encodeIt(_ root: TreeNode?) {
81-
guard let root = root else {
82-
encodeStr += "# "
83-
return
84-
}
60+
return str
61+
}
8562

86-
encodeStr += root.val + " "
87-
encodeIt(root.left)
88-
encodeIt(root.right)
89-
}
63+
public func decode<T>(from string: String) -> BinaryNode<T>? {
64+
var components = string.split(separator: separator).reversed().map(String.init)
65+
return decode(from: &components)
66+
}
9067
}
9168

92-
extension String {
93-
func index(of target: Character) -> String.Index {
94-
var i = 0
95-
for c in self.characters {
96-
if c == target {
97-
return self.index(self.startIndex, offsetBy: i)
98-
}
99-
i += 1
100-
}
101-
102-
return self.endIndex
69+
public class BinaryNode<Element: Comparable> {
70+
public var val: Element
71+
public var left: BinaryNode?
72+
public var right: BinaryNode?
73+
74+
public init(_ val: Element, left: BinaryNode? = nil, right: BinaryNode? = nil) {
75+
self.val = val
76+
self.left = left
77+
self.right = right
78+
}
79+
80+
public func preOrderTraversal(visit: (Element?) throws -> ()) rethrows {
81+
try visit(val)
82+
83+
if let left = left {
84+
try left.preOrderTraversal(visit: visit)
85+
} else {
86+
try visit(nil)
87+
}
88+
89+
if let right = right {
90+
try right.preOrderTraversal(visit: visit)
91+
} else {
92+
try visit(nil)
10393
}
94+
}
10495
}

Encode and Decode Tree/EncodeAndDecodeTree.swift

Lines changed: 64 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -8,97 +8,88 @@
88

99
import Foundation
1010

11-
public class TreeNode {
12-
public var val: String
13-
public var left: TreeNode?
14-
public var right: TreeNode?
15-
16-
public init(_ val: String, left: TreeNode? = nil, right: TreeNode? = nil) {
17-
self.val = val
18-
self.left = left
19-
self.right = right
20-
}
11+
protocol BinaryNodeEncoder {
12+
func encode<T>(_ node: BinaryNode<T>?) throws -> String
2113
}
2214

23-
public class EncodeAndDecodeTree {
24-
private var encodeStr = ""
25-
private var ret: [String] = []
15+
protocol BinaryNodeDecoder {
16+
func decode<T>(from string: String) -> BinaryNode<T>?
17+
}
2618

27-
public init() {}
19+
public class BinaryNodeCoder<T: Comparable>: BinaryNodeEncoder, BinaryNodeDecoder {
2820

29-
public func encode(_ root: TreeNode?) -> String {
30-
encodeIt(root)
21+
// MARK: Private
3122

32-
return encodeStr
33-
}
23+
private let separator: Character = ","
24+
private let nilNode = "X"
3425

35-
public func decode(_ data: String) -> TreeNode? {
36-
var s = data
37-
while (s.contains(" ")) {
38-
let index = s.index(of: " ")
39-
let endIndex = s.index(before: index)
40-
let element = s[s.startIndex...endIndex]
41-
ret.append(element)
42-
let range = ClosedRange(uncheckedBounds: (lower: s.startIndex, upper: index))
43-
s.removeSubrange(range)
44-
}
45-
46-
if ret.count == 0 {
47-
return nil
48-
}
49-
50-
var dep = 0
51-
let root = decodeIt(&dep)
52-
53-
return root
26+
private func decode<T>(from array: inout [String]) -> BinaryNode<T>? {
27+
guard !array.isEmpty else {
28+
return nil
5429
}
5530

56-
private func getNode(_ element: String) -> TreeNode? {
57-
if element == "#" {
58-
return nil
59-
}
31+
let value = array.removeLast()
6032

61-
return TreeNode(element)
33+
guard value != nilNode, let val = value as? T else {
34+
return nil
6235
}
6336

64-
private func decodeIt(_ dep: inout Int) -> TreeNode? {
65-
guard let currentNode = getNode(ret[dep]) else {
66-
return nil
67-
}
37+
let node = BinaryNode<T>(val)
38+
node.left = decode(from: &array)
39+
node.right = decode(from: &array)
6840

69-
dep += 1
70-
let left = decodeIt(&dep)
71-
dep += 1
72-
let right = decodeIt(&dep)
41+
return node
42+
}
7343

74-
currentNode.left = left
75-
currentNode.right = right
44+
// MARK: Public
7645

77-
return currentNode
46+
public init() {}
47+
48+
public func encode<T>(_ node: BinaryNode<T>?) throws -> String {
49+
var str = ""
50+
node?.preOrderTraversal { data in
51+
if let data = data {
52+
let string = String(describing: data)
53+
str.append(string)
54+
} else {
55+
str.append(nilNode)
56+
}
57+
str.append(separator)
7858
}
7959

80-
private func encodeIt(_ root: TreeNode?) {
81-
guard let root = root else {
82-
encodeStr += "# "
83-
return
84-
}
60+
return str
61+
}
8562

86-
encodeStr += root.val + " "
87-
encodeIt(root.left)
88-
encodeIt(root.right)
89-
}
63+
public func decode<T>(from string: String) -> BinaryNode<T>? {
64+
var components = string.split(separator: separator).reversed().map(String.init)
65+
return decode(from: &components)
66+
}
9067
}
9168

92-
extension String {
93-
func index(of target: Character) -> String.Index {
94-
var i = 0
95-
for c in self.characters {
96-
if c == target {
97-
return self.index(self.startIndex, offsetBy: i)
98-
}
99-
i += 1
100-
}
101-
102-
return self.endIndex
69+
public class BinaryNode<Element: Comparable> {
70+
public var val: Element
71+
public var left: BinaryNode?
72+
public var right: BinaryNode?
73+
74+
public init(_ val: Element, left: BinaryNode? = nil, right: BinaryNode? = nil) {
75+
self.val = val
76+
self.left = left
77+
self.right = right
78+
}
79+
80+
public func preOrderTraversal(visit: (Element?) throws -> ()) rethrows {
81+
try visit(val)
82+
83+
if let left = left {
84+
try left.preOrderTraversal(visit: visit)
85+
} else {
86+
try visit(nil)
87+
}
88+
89+
if let right = right {
90+
try right.preOrderTraversal(visit: visit)
91+
} else {
92+
try visit(nil)
10393
}
94+
}
10495
}

0 commit comments

Comments
 (0)