@@ -106,58 +106,30 @@ extension BinarySearchTree {
106
106
*/
107
107
@discardableResult public func remove( ) -> BinarySearchTree ? {
108
108
let replacement : BinarySearchTree ?
109
-
109
+
110
+ // Replacement for current node can be either biggest one on the left or
111
+ // smallest one on the right, whichever is not nil
110
112
if let left = left {
111
- if let right = right {
112
- replacement = removeNodeWithTwoChildren ( left, right)
113
- } else {
114
- // This node only has a left child. The left child replaces the node.
115
- replacement = left
116
- }
113
+ replacement = left. maximum ( )
117
114
} else if let right = right {
118
- // This node only has a right child. The right child replaces the node.
119
- replacement = right
115
+ replacement = right. minimum ( )
120
116
} else {
121
- // This node has no children. We just disconnect it from its parent.
122
- replacement = nil
117
+ replacement = nil ;
123
118
}
124
-
125
- reconnectParentTo ( node: replacement)
126
-
119
+
120
+ replacement? . remove ( ) ;
121
+
122
+ // Place the replacement on current node's position
123
+ replacement? . right = right;
124
+ replacement? . left = left;
125
+ reconnectParentTo ( node: replacement) ;
126
+
127
127
// The current node is no longer part of the tree, so clean it up.
128
128
parent = nil
129
129
left = nil
130
130
right = nil
131
-
132
- return replacement
133
- }
134
-
135
- private func removeNodeWithTwoChildren( _ left: BinarySearchTree , _ right: BinarySearchTree ) -> BinarySearchTree {
136
- // This node has two children. It must be replaced by the smallest
137
- // child that is larger than this node's value, which is the leftmost
138
- // descendent of the right child.
139
- let successor = right. minimum ( )
140
-
141
- // If this in-order successor has a right child of its own (it cannot
142
- // have a left child by definition), then that must take its place.
143
- successor. remove ( )
144
-
145
- // Connect our left child with the new node.
146
- successor. left = left
147
- left. parent = successor
148
-
149
- // Connect our right child with the new node. If the right child does
150
- // not have any left children of its own, then the in-order successor
151
- // *is* the right child.
152
- if right !== successor {
153
- successor. right = right
154
- right. parent = successor
155
- } else {
156
- successor. right = nil
157
- }
158
-
159
- // And finally, connect the successor node to our parent.
160
- return successor
131
+
132
+ return replacement;
161
133
}
162
134
163
135
private func reconnectParentTo( node: BinarySearchTree ? ) {
@@ -350,24 +322,23 @@ extension BinarySearchTree: CustomStringConvertible {
350
322
}
351
323
return s
352
324
}
353
- }
354
-
355
- extension BinarySearchTree : CustomDebugStringConvertible {
356
- public var debugDescription : String {
357
- var s = " value: \( value) "
358
- if let parent = parent {
359
- s += " , parent: \( parent. value) "
360
- }
361
- if let left = left {
362
- s += " , left = [ " + left. debugDescription + " ] "
363
- }
364
- if let right = right {
365
- s += " , right = [ " + right. debugDescription + " ] "
366
- }
367
- return s
368
- }
325
+
326
+ public func toArray( ) -> [ T ] {
327
+ return map { $0 }
328
+ }
369
329
370
- public func toArray( ) -> [ T ] {
371
- return map { $0 }
372
- }
373
330
}
331
+
332
+ //extension BinarySearchTree: CustomDebugStringConvertible {
333
+ // public var debugDescription: String {
334
+ // var s = ""
335
+ // if let left = left {
336
+ // s += "(\(left.description)) <- "
337
+ // }
338
+ // s += "\(value)"
339
+ // if let right = right {
340
+ // s += " -> (\(right.description))"
341
+ // }
342
+ // return s
343
+ // }
344
+ //}
0 commit comments