Skip to content

Commit c227993

Browse files
committed
left/right tree should reconnect to new node
1 parent b2f8a16 commit c227993

File tree

4 files changed

+61
-47
lines changed

4 files changed

+61
-47
lines changed

Binary Search Tree/Solution 1/BinarySearchTree.playground/Sources/BinarySearchTree.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ extension BinarySearchTree {
109109

110110
// Replacement for current node can be either biggest one on the left or
111111
// smallest one on the right, whichever is not nil
112-
if let left = left {
113-
replacement = left.maximum()
114-
} else if let right = right {
112+
if let right = right {
115113
replacement = right.minimum()
114+
} else if let left = left {
115+
replacement = left.maximum()
116116
} else {
117117
replacement = nil;
118118
}
@@ -122,6 +122,8 @@ extension BinarySearchTree {
122122
// Place the replacement on current node's position
123123
replacement?.right = right;
124124
replacement?.left = left;
125+
right?.parent = replacement
126+
left?.parent = replacement
125127
reconnectParentTo(node:replacement);
126128

127129
// The current node is no longer part of the tree, so clean it up.

Binary Search Tree/Solution 1/Tests/BinarySearchTreeTests.swift

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,26 @@ class BinarySearchTreeTest: XCTestCase {
1717
XCTAssertEqual(tree.count, 8)
1818
XCTAssertEqual(tree.toArray(), [3, 5, 6, 8, 9, 10, 12, 16])
1919

20-
XCTAssertEqual(tree.search(9)!.value, 9)
21-
XCTAssertNil(tree.search(99))
20+
XCTAssertEqual(tree.search(value: 9)!.value, 9)
21+
XCTAssertNil(tree.search(value: 99))
2222

2323
XCTAssertEqual(tree.minimum().value, 3)
2424
XCTAssertEqual(tree.maximum().value, 16)
2525

2626
XCTAssertEqual(tree.height(), 3)
2727
XCTAssertEqual(tree.depth(), 0)
2828

29-
let node1 = tree.search(16)
29+
let node1 = tree.search(value: 16)
3030
XCTAssertNotNil(node1)
3131
XCTAssertEqual(node1!.height(), 0)
3232
XCTAssertEqual(node1!.depth(), 3)
3333

34-
let node2 = tree.search(12)
34+
let node2 = tree.search(value: 12)
3535
XCTAssertNotNil(node2)
3636
XCTAssertEqual(node2!.height(), 1)
3737
XCTAssertEqual(node2!.depth(), 2)
3838

39-
let node3 = tree.search(10)
39+
let node3 = tree.search(value: 10)
4040
XCTAssertNotNil(node3)
4141
XCTAssertEqual(node3!.height(), 2)
4242
XCTAssertEqual(node3!.depth(), 1)
@@ -45,32 +45,32 @@ class BinarySearchTreeTest: XCTestCase {
4545
func testInsert() {
4646
let tree = BinarySearchTree(value: 8)
4747

48-
tree.insert(5)
48+
tree.insert(value: 5)
4949
XCTAssertEqual(tree.count, 2)
5050
XCTAssertEqual(tree.height(), 1)
5151
XCTAssertEqual(tree.depth(), 0)
5252

53-
let node1 = tree.search(5)
53+
let node1 = tree.search(value: 5)
5454
XCTAssertNotNil(node1)
5555
XCTAssertEqual(node1!.height(), 0)
5656
XCTAssertEqual(node1!.depth(), 1)
5757

58-
tree.insert(10)
58+
tree.insert(value: 10)
5959
XCTAssertEqual(tree.count, 3)
6060
XCTAssertEqual(tree.height(), 1)
6161
XCTAssertEqual(tree.depth(), 0)
6262

63-
let node2 = tree.search(10)
63+
let node2 = tree.search(value: 10)
6464
XCTAssertNotNil(node2)
6565
XCTAssertEqual(node2!.height(), 0)
6666
XCTAssertEqual(node2!.depth(), 1)
6767

68-
tree.insert(3)
68+
tree.insert(value: 3)
6969
XCTAssertEqual(tree.count, 4)
7070
XCTAssertEqual(tree.height(), 2)
7171
XCTAssertEqual(tree.depth(), 0)
7272

73-
let node3 = tree.search(3)
73+
let node3 = tree.search(value: 3)
7474
XCTAssertNotNil(node3)
7575
XCTAssertEqual(node3!.height(), 0)
7676
XCTAssertEqual(node3!.depth(), 2)
@@ -84,9 +84,9 @@ class BinarySearchTreeTest: XCTestCase {
8484

8585
func testInsertDuplicates() {
8686
let tree = BinarySearchTree(array: [8, 5, 10])
87-
tree.insert(8)
88-
tree.insert(5)
89-
tree.insert(10)
87+
tree.insert(value: 8)
88+
tree.insert(value: 5)
89+
tree.insert(value: 10)
9090
XCTAssertEqual(tree.count, 6)
9191
XCTAssertEqual(tree.toArray(), [5, 5, 8, 8, 10, 10])
9292
}
@@ -108,7 +108,7 @@ class BinarySearchTreeTest: XCTestCase {
108108
}
109109

110110
func testInsertSorted() {
111-
let tree = BinarySearchTree(array: [8, 5, 10, 3, 12, 9, 6, 16].sort(<))
111+
let tree = BinarySearchTree(array: [8, 5, 10, 3, 12, 9, 6, 16].sorted(by: <))
112112
XCTAssertEqual(tree.count, 8)
113113
XCTAssertEqual(tree.toArray(), [3, 5, 6, 8, 9, 10, 12, 16])
114114

@@ -118,7 +118,7 @@ class BinarySearchTreeTest: XCTestCase {
118118
XCTAssertEqual(tree.height(), 7)
119119
XCTAssertEqual(tree.depth(), 0)
120120

121-
let node1 = tree.search(16)
121+
let node1 = tree.search(value: 16)
122122
XCTAssertNotNil(node1)
123123
XCTAssertEqual(node1!.height(), 0)
124124
XCTAssertEqual(node1!.depth(), 7)
@@ -127,15 +127,15 @@ class BinarySearchTreeTest: XCTestCase {
127127
func testRemoveLeaf() {
128128
let tree = BinarySearchTree(array: [8, 5, 10, 4])
129129

130-
let node10 = tree.search(10)!
130+
let node10 = tree.search(value: 10)!
131131
XCTAssertNil(node10.left)
132132
XCTAssertNil(node10.right)
133133
XCTAssertTrue(tree.right === node10)
134134

135-
let node5 = tree.search(5)!
135+
let node5 = tree.search(value: 5)!
136136
XCTAssertTrue(tree.left === node5)
137137

138-
let node4 = tree.search(4)!
138+
let node4 = tree.search(value: 4)!
139139
XCTAssertTrue(node5.left === node4)
140140
XCTAssertNil(node5.right)
141141

@@ -158,8 +158,8 @@ class BinarySearchTreeTest: XCTestCase {
158158
func testRemoveOneChildLeft() {
159159
let tree = BinarySearchTree(array: [8, 5, 10, 4, 9])
160160

161-
let node4 = tree.search(4)!
162-
let node5 = tree.search(5)!
161+
let node4 = tree.search(value: 4)!
162+
let node5 = tree.search(value: 5)!
163163
XCTAssertTrue(node5.left === node4)
164164
XCTAssertTrue(node5 === node4.parent)
165165

@@ -171,8 +171,8 @@ class BinarySearchTreeTest: XCTestCase {
171171
XCTAssertEqual(tree.count, 4)
172172
XCTAssertEqual(tree.toArray(), [4, 8, 9, 10])
173173

174-
let node9 = tree.search(9)!
175-
let node10 = tree.search(10)!
174+
let node9 = tree.search(value: 9)!
175+
let node10 = tree.search(value: 10)!
176176
XCTAssertTrue(node10.left === node9)
177177
XCTAssertTrue(node10 === node9.parent)
178178

@@ -188,8 +188,8 @@ class BinarySearchTreeTest: XCTestCase {
188188
func testRemoveOneChildRight() {
189189
let tree = BinarySearchTree(array: [8, 5, 10, 6, 11])
190190

191-
let node6 = tree.search(6)!
192-
let node5 = tree.search(5)!
191+
let node6 = tree.search(value: 6)!
192+
let node5 = tree.search(value: 5)!
193193
XCTAssertTrue(node5.right === node6)
194194
XCTAssertTrue(node5 === node6.parent)
195195

@@ -201,8 +201,8 @@ class BinarySearchTreeTest: XCTestCase {
201201
XCTAssertEqual(tree.count, 4)
202202
XCTAssertEqual(tree.toArray(), [6, 8, 10, 11])
203203

204-
let node11 = tree.search(11)!
205-
let node10 = tree.search(10)!
204+
let node11 = tree.search(value: 11)!
205+
let node10 = tree.search(value: 10)!
206206
XCTAssertTrue(node10.right === node11)
207207
XCTAssertTrue(node10 === node11.parent)
208208

@@ -218,9 +218,9 @@ class BinarySearchTreeTest: XCTestCase {
218218
func testRemoveTwoChildrenSimple() {
219219
let tree = BinarySearchTree(array: [8, 5, 10, 4, 6, 9, 11])
220220

221-
let node4 = tree.search(4)!
222-
let node5 = tree.search(5)!
223-
let node6 = tree.search(6)!
221+
let node4 = tree.search(value: 4)!
222+
let node5 = tree.search(value: 5)!
223+
let node6 = tree.search(value: 6)!
224224
XCTAssertTrue(node5.left === node4)
225225
XCTAssertTrue(node5.right === node6)
226226
XCTAssertTrue(node5 === node4.parent)
@@ -241,9 +241,9 @@ class BinarySearchTreeTest: XCTestCase {
241241
XCTAssertEqual(tree.count, 6)
242242
XCTAssertEqual(tree.toArray(), [4, 6, 8, 9, 10, 11])
243243

244-
let node9 = tree.search(9)!
245-
let node10 = tree.search(10)!
246-
let node11 = tree.search(11)!
244+
let node9 = tree.search(value: 9)!
245+
let node10 = tree.search(value: 10)!
246+
let node11 = tree.search(value: 11)!
247247
XCTAssertTrue(node10.left === node9)
248248
XCTAssertTrue(node10.right === node11)
249249
XCTAssertTrue(node10 === node9.parent)
@@ -268,11 +268,12 @@ class BinarySearchTreeTest: XCTestCase {
268268
func testRemoveTwoChildrenComplex() {
269269
let tree = BinarySearchTree(array: [8, 5, 10, 4, 9, 20, 11, 15, 13])
270270

271-
let node9 = tree.search(9)!
272-
let node10 = tree.search(10)!
273-
let node11 = tree.search(11)!
274-
let node15 = tree.search(15)!
275-
let node20 = tree.search(20)!
271+
let node9 = tree.search(value: 9)!
272+
let node10 = tree.search(value: 10)!
273+
let node11 = tree.search(value: 11)!
274+
let node13 = tree.search(value: 13)!
275+
let node15 = tree.search(value: 15)!
276+
let node20 = tree.search(value: 20)!
276277
XCTAssertTrue(node10.left === node9)
277278
XCTAssertTrue(node10 === node9.parent)
278279
XCTAssertTrue(node10.right === node20)
@@ -290,8 +291,8 @@ class BinarySearchTreeTest: XCTestCase {
290291
XCTAssertTrue(node11 === node9.parent)
291292
XCTAssertTrue(node11.right === node20)
292293
XCTAssertTrue(node11 === node20.parent)
293-
XCTAssertTrue(node20.left === node15)
294-
XCTAssertTrue(node20 === node15.parent)
294+
XCTAssertTrue(node20.left === node13)
295+
XCTAssertTrue(node20 === node13.parent)
295296
XCTAssertNil(node20.right)
296297
XCTAssertNil(node10.left)
297298
XCTAssertNil(node10.right)
@@ -303,7 +304,7 @@ class BinarySearchTreeTest: XCTestCase {
303304
func testRemoveRoot() {
304305
let tree = BinarySearchTree(array: [8, 5, 10, 4, 9, 20, 11, 15, 13])
305306

306-
let node9 = tree.search(9)!
307+
let node9 = tree.search(value: 9)!
307308

308309
let newRoot = tree.remove()
309310
XCTAssertTrue(newRoot === node9)
@@ -319,7 +320,7 @@ class BinarySearchTreeTest: XCTestCase {
319320

320321
func testPredecessor() {
321322
let tree = BinarySearchTree(array: [3, 1, 2, 5, 4])
322-
let node = tree.search(5)
323+
let node = tree.search(value: 5)
323324

324325
XCTAssertEqual(node!.value, 5)
325326
XCTAssertEqual(node!.predecessor()!.value, 4)
@@ -331,7 +332,7 @@ class BinarySearchTreeTest: XCTestCase {
331332

332333
func testSuccessor() {
333334
let tree = BinarySearchTree(array: [3, 1, 2, 5, 4])
334-
let node = tree.search(1)
335+
let node = tree.search(value: 1)
335336

336337
XCTAssertEqual(node!.value, 1)
337338
XCTAssertEqual(node!.successor()!.value, 2)

Binary Search Tree/Solution 1/Tests/Tests.xcodeproj/project.pbxproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
1616
7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
1717
7B80C3D91C77A323003CECC7 /* BinarySearchTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BinarySearchTreeTests.swift; sourceTree = SOURCE_ROOT; };
18-
9E5A58B81E304C3100DAB3BB /* BinarySearchTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BinarySearchTree.swift; path = ../BinarySearchTree.playground/Sources/BinarySearchTree.swift; sourceTree = "<group>"; };
18+
9E5A58B81E304C3100DAB3BB /* BinarySearchTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BinarySearchTree.swift; path = ../BinarySearchTree.playground/Sources/BinarySearchTree.swift; sourceTree = SOURCE_ROOT; };
1919
/* End PBXFileReference section */
2020

2121
/* Begin PBXFrameworksBuildPhase section */
@@ -88,6 +88,7 @@
8888
TargetAttributes = {
8989
7B2BBC7F1C779D720067B71D = {
9090
CreatedOnToolsVersion = 7.2;
91+
LastSwiftMigration = 0820;
9192
};
9293
};
9394
};
@@ -220,6 +221,7 @@
220221
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
221222
PRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;
222223
PRODUCT_NAME = "$(TARGET_NAME)";
224+
SWIFT_VERSION = 3.0;
223225
};
224226
name = Debug;
225227
};
@@ -231,6 +233,7 @@
231233
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
232234
PRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;
233235
PRODUCT_NAME = "$(TARGET_NAME)";
236+
SWIFT_VERSION = 3.0;
234237
};
235238
name = Release;
236239
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>
6+
<false/>
7+
</dict>
8+
</plist>

0 commit comments

Comments
 (0)