/
BinaryNode.swift
72 lines (62 loc) · 2.06 KB
/
BinaryNode.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import Foundation
public class BinaryNode<Element> {
public var value: Element
public var leftChild: BinaryNode?
public var rightChild: BinaryNode?
public init(value: Element) {
self.value = value
}
}
extension BinaryNode: CustomStringConvertible {
public var description: String {
diagram(for: self)
}
private func diagram(for node: BinaryNode?,
_ top: String = "",
_ root: String = "",
_ bottom: String = "") -> String {
guard let node = node else {
return root + "nil\n"
}
if node.leftChild == nil && node.rightChild == nil {
return root + "\(node.value)\n"
}
return diagram(for: node.rightChild, top + " ", top + "┌──", top + "│ ")
+ root + "\(node.value)\n"
+ diagram(for: node.leftChild, bottom + "│ ", bottom + "└──", bottom + " ")
}
}
extension BinaryNode {
/// 中序遍历
public func traversalInOrder(visit: (Element) -> Void) {
leftChild?.traversalInOrder(visit: visit)
visit(value)
rightChild?.traversalInOrder(visit: visit)
}
/// 前序遍历
public func traversalPreOrder(visit: (Element) -> Void) {
visit(value)
leftChild?.traversalPreOrder(visit: visit)
rightChild?.traversalPreOrder(visit: visit)
}
/// 后序遍历
public func traversalPostOrder(visit: (Element) -> Void) {
leftChild?.traversalPostOrder(visit: visit)
rightChild?.traversalPostOrder(visit: visit)
visit(value)
}
/// 前序遍历二叉树,会遍历空节点。
public func traversePreOrder(visit: (Element?) -> Void) {
visit(value)
if let leftChild = leftChild {
leftChild.traversePreOrder(visit: visit)
} else {
visit(nil)
}
if let rightChild = rightChild {
rightChild.traversePreOrder(visit: visit)
} else {
visit(nil)
}
}
}