22
22
23
23
public class TreeNode < Key: Comparable , Payload> {
24
24
public typealias Node = TreeNode < Key , Payload >
25
-
26
- var payload : Payload ?
27
-
28
- fileprivate var key : Key
25
+
26
+ var payload : Payload ? // Value held by the node
27
+
28
+ fileprivate var key : Key // Node's name
29
29
internal var leftChild : Node ?
30
30
internal var rightChild : Node ?
31
31
fileprivate var height : Int
32
- fileprivate weak var parent : Node ?
33
-
32
+ weak fileprivate var parent : Node ?
33
+
34
34
public init ( key: Key , payload: Payload ? , leftChild: Node ? , rightChild: Node ? , parent: Node ? , height: Int ) {
35
35
self . key = key
36
36
self . payload = payload
37
37
self . leftChild = leftChild
38
38
self . rightChild = rightChild
39
39
self . parent = parent
40
40
self . height = height
41
-
41
+
42
42
self . leftChild? . parent = self
43
43
self . rightChild? . parent = self
44
44
}
45
-
45
+
46
46
public convenience init ( key: Key , payload: Payload ? ) {
47
47
self . init ( key: key, payload: payload, leftChild: nil , rightChild: nil , parent: nil , height: 1 )
48
48
}
49
-
49
+
50
50
public convenience init ( key: Key ) {
51
51
self . init ( key: key, payload: nil )
52
52
}
53
-
53
+
54
54
var isRoot : Bool {
55
55
return parent == nil
56
56
}
57
-
57
+
58
58
var isLeaf : Bool {
59
59
return rightChild == nil && leftChild == nil
60
60
}
61
-
61
+
62
62
var isLeftChild : Bool {
63
63
return parent? . leftChild === self
64
64
}
65
-
65
+
66
66
var isRightChild : Bool {
67
67
return parent? . rightChild === self
68
68
}
69
-
69
+
70
70
var hasLeftChild : Bool {
71
71
return leftChild != nil
72
72
}
73
-
73
+
74
74
var hasRightChild : Bool {
75
75
return rightChild != nil
76
76
}
77
-
77
+
78
78
var hasAnyChild : Bool {
79
79
return leftChild != nil || rightChild != nil
80
80
}
81
-
81
+
82
82
var hasBothChildren : Bool {
83
83
return leftChild != nil && rightChild != nil
84
84
}
@@ -88,10 +88,10 @@ public class TreeNode<Key: Comparable, Payload> {
88
88
89
89
open class AVLTree < Key: Comparable , Payload> {
90
90
public typealias Node = TreeNode < Key , Payload >
91
-
91
+
92
92
fileprivate( set) var root : Node ?
93
93
fileprivate( set) var size = 0
94
-
94
+
95
95
public init ( ) { }
96
96
}
97
97
@@ -101,7 +101,7 @@ extension TreeNode {
101
101
public func minimum( ) -> TreeNode ? {
102
102
return leftChild? . minimum ( ) ?? self
103
103
}
104
-
104
+
105
105
public func maximum( ) -> TreeNode ? {
106
106
return rightChild? . maximum ( ) ?? self
107
107
}
@@ -112,11 +112,11 @@ extension AVLTree {
112
112
get { return search ( input: key) }
113
113
set { insert ( key: key, payload: newValue) }
114
114
}
115
-
115
+
116
116
public func search( input: Key ) -> Payload ? {
117
117
return search ( key: input, node: root) ? . payload
118
118
}
119
-
119
+
120
120
fileprivate func search( key: Key , node: Node ? ) -> Node ? {
121
121
if let node = node {
122
122
if key == node. key {
@@ -142,7 +142,7 @@ extension AVLTree {
142
142
}
143
143
size += 1
144
144
}
145
-
145
+
146
146
private func insert( input: Key , payload: Payload ? , node: Node ) {
147
147
if input < node. key {
148
148
if let child = node. leftChild {
@@ -152,7 +152,7 @@ extension AVLTree {
152
152
node. leftChild = child
153
153
balance ( node: child)
154
154
}
155
- } else {
155
+ } else if input != node . key {
156
156
if let child = node. rightChild {
157
157
insert ( input: input, payload: payload, node: child)
158
158
} else {
@@ -175,25 +175,25 @@ extension AVLTree {
175
175
updateHeightUpwards ( node: node. parent)
176
176
}
177
177
}
178
-
178
+
179
179
fileprivate func lrDifference( node: Node ? ) -> Int {
180
180
let lHeight = node? . leftChild? . height ?? 0
181
181
let rHeight = node? . rightChild? . height ?? 0
182
182
return lHeight - rHeight
183
183
}
184
-
184
+
185
185
fileprivate func balance( node: Node ? ) {
186
186
guard let node = node else {
187
187
return
188
188
}
189
-
189
+
190
190
updateHeightUpwards ( node: node. leftChild)
191
191
updateHeightUpwards ( node: node. rightChild)
192
-
192
+
193
193
var nodes = [ Node? ] ( repeating: nil , count: 3 )
194
194
var subtrees = [ Node? ] ( repeating: nil , count: 4 )
195
195
let nodeParent = node. parent
196
-
196
+
197
197
let lrFactor = lrDifference ( node: node)
198
198
if lrFactor > 1 {
199
199
// left-left or left-right
@@ -202,7 +202,7 @@ extension AVLTree {
202
202
nodes [ 0 ] = node
203
203
nodes [ 2 ] = node. leftChild
204
204
nodes [ 1 ] = nodes [ 2 ] ? . leftChild
205
-
205
+
206
206
subtrees [ 0 ] = nodes [ 1 ] ? . leftChild
207
207
subtrees [ 1 ] = nodes [ 1 ] ? . rightChild
208
208
subtrees [ 2 ] = nodes [ 2 ] ? . rightChild
@@ -212,7 +212,7 @@ extension AVLTree {
212
212
nodes [ 0 ] = node
213
213
nodes [ 1 ] = node. leftChild
214
214
nodes [ 2 ] = nodes [ 1 ] ? . rightChild
215
-
215
+
216
216
subtrees [ 0 ] = nodes [ 1 ] ? . leftChild
217
217
subtrees [ 1 ] = nodes [ 2 ] ? . leftChild
218
218
subtrees [ 2 ] = nodes [ 2 ] ? . rightChild
@@ -225,7 +225,7 @@ extension AVLTree {
225
225
nodes [ 1 ] = node
226
226
nodes [ 2 ] = node. rightChild
227
227
nodes [ 0 ] = nodes [ 2 ] ? . rightChild
228
-
228
+
229
229
subtrees [ 0 ] = nodes [ 1 ] ? . leftChild
230
230
subtrees [ 1 ] = nodes [ 2 ] ? . leftChild
231
231
subtrees [ 2 ] = nodes [ 0 ] ? . leftChild
@@ -235,7 +235,7 @@ extension AVLTree {
235
235
nodes [ 1 ] = node
236
236
nodes [ 0 ] = node. rightChild
237
237
nodes [ 2 ] = nodes [ 0 ] ? . leftChild
238
-
238
+
239
239
subtrees [ 0 ] = nodes [ 1 ] ? . leftChild
240
240
subtrees [ 1 ] = nodes [ 2 ] ? . leftChild
241
241
subtrees [ 2 ] = nodes [ 2 ] ? . rightChild
@@ -246,9 +246,9 @@ extension AVLTree {
246
246
balance ( node: node. parent)
247
247
return
248
248
}
249
-
249
+
250
250
// nodes[2] is always the head
251
-
251
+
252
252
if node. isRoot {
253
253
root = nodes [ 2 ]
254
254
root? . parent = nil
@@ -259,25 +259,25 @@ extension AVLTree {
259
259
nodeParent? . rightChild = nodes [ 2 ]
260
260
nodes [ 2 ] ? . parent = nodeParent
261
261
}
262
-
262
+
263
263
nodes [ 2 ] ? . leftChild = nodes [ 1 ]
264
264
nodes [ 1 ] ? . parent = nodes [ 2 ]
265
265
nodes [ 2 ] ? . rightChild = nodes [ 0 ]
266
266
nodes [ 0 ] ? . parent = nodes [ 2 ]
267
-
267
+
268
268
nodes [ 1 ] ? . leftChild = subtrees [ 0 ]
269
269
subtrees [ 0 ] ? . parent = nodes [ 1 ]
270
270
nodes [ 1 ] ? . rightChild = subtrees [ 1 ]
271
271
subtrees [ 1 ] ? . parent = nodes [ 1 ]
272
-
272
+
273
273
nodes [ 0 ] ? . leftChild = subtrees [ 2 ]
274
274
subtrees [ 2 ] ? . parent = nodes [ 0 ]
275
275
nodes [ 0 ] ? . rightChild = subtrees [ 3 ]
276
276
subtrees [ 3 ] ? . parent = nodes [ 0 ]
277
-
277
+
278
278
updateHeightUpwards ( node: nodes [ 1 ] ) // Update height from left
279
279
updateHeightUpwards ( node: nodes [ 0 ] ) // Update height from right
280
-
280
+
281
281
balance ( node: nodes [ 2 ] ? . parent)
282
282
}
283
283
}
@@ -299,11 +299,35 @@ extension AVLTree {
299
299
display ( node: node. leftChild, level: level + 1 )
300
300
}
301
301
}
302
-
302
+
303
303
public func display( node: Node ) {
304
304
display ( node: node, level: 0 )
305
305
print ( " " )
306
306
}
307
+
308
+ public func inorder( node: Node ? ) -> String {
309
+ var output = " "
310
+ if let node = node {
311
+ output = " \( inorder ( node: node. leftChild) ) \( print ( " \( node. key) " ) ) \( inorder ( node: node. rightChild) ) "
312
+ }
313
+ return output
314
+ }
315
+
316
+ public func preorder( node: Node ? ) -> String {
317
+ var output = " "
318
+ if let node = node {
319
+ output = " \( preorder ( node: node. leftChild) ) \( print ( " \( node. key) " ) ) \( preorder ( node: node. rightChild) ) "
320
+ }
321
+ return output
322
+ }
323
+
324
+ public func postorder( node: Node ? ) -> String {
325
+ var output = " "
326
+ if let node = node {
327
+ output = " \( postorder ( node: node. leftChild) ) \( print ( " \( node. key) " ) ) \( postorder ( node: node. rightChild) ) "
328
+ }
329
+ return output
330
+ }
307
331
}
308
332
309
333
// MARK: - Delete node
@@ -318,7 +342,7 @@ extension AVLTree {
318
342
size -= 1
319
343
}
320
344
}
321
-
345
+
322
346
private func delete( node: Node ) {
323
347
if node. isLeaf {
324
348
// Just remove and balance up
@@ -327,13 +351,13 @@ extension AVLTree {
327
351
// just in case
328
352
fatalError ( " Error: tree is invalid. " )
329
353
}
330
-
354
+
331
355
if node. isLeftChild {
332
356
parent. leftChild = nil
333
357
} else if node. isRightChild {
334
358
parent. rightChild = nil
335
359
}
336
-
360
+
337
361
balance ( node: parent)
338
362
} else {
339
363
// at root
@@ -354,6 +378,46 @@ extension AVLTree {
354
378
}
355
379
}
356
380
381
+ // MARK: - Advanced Stuff
382
+
383
+ extension AVLTree {
384
+ public func doInOrder( node: Node ? , _ completion: ( Node ) -> Void ) {
385
+ if let node = node {
386
+ doInOrder ( node: node. leftChild) { lnode in
387
+ completion ( lnode)
388
+ }
389
+ completion ( node)
390
+ doInOrder ( node: node. rightChild) { rnode in
391
+ completion ( rnode)
392
+ }
393
+ }
394
+ }
395
+
396
+ public func doInPreOrder( node: Node ? , _ completion: ( Node ) -> Void ) {
397
+ if let node = node {
398
+ completion ( node)
399
+ doInPreOrder ( node: node. leftChild) { lnode in
400
+ completion ( lnode)
401
+ }
402
+ doInPreOrder ( node: node. rightChild) { rnode in
403
+ completion ( rnode)
404
+ }
405
+ }
406
+ }
407
+
408
+ public func doInPostOrder( node: Node ? , _ completion: ( Node ) -> Void ) {
409
+ if let node = node {
410
+ doInPostOrder ( node: node. leftChild) { lnode in
411
+ completion ( lnode)
412
+ }
413
+ doInPostOrder ( node: node. rightChild) { rnode in
414
+ completion ( rnode)
415
+ }
416
+ completion ( node)
417
+ }
418
+ }
419
+ }
420
+
357
421
// MARK: - Debugging
358
422
359
423
extension TreeNode : CustomDebugStringConvertible {
0 commit comments