Skip to content

Commit 90820ce

Browse files
authored
Merge pull request #4 from Alokzh/binary-search-tree-implementation
Enhance BST Implementation - Add Complete Functionality
2 parents db183c3 + 9f04ff9 commit 90820ce

File tree

5 files changed

+821
-28
lines changed

5 files changed

+821
-28
lines changed

src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st

Lines changed: 310 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
"
2-
A CTBinarySearchTreeTest is a test class for testing the behavior of CTBinarySearchTree
2+
I test the Binary Search Tree implementation (CTBinarySearchTree).
3+
4+
I verify correctness of all tree operations including insertion, deletion, search, traversals, and collection protocol methods. I test edge cases like empty trees, single nodes, and complex removal scenarios.
5+
6+
I ensure the BST maintains its ordering property and handles duplicates correctly.
37
"
48
Class {
59
#name : 'CTBinarySearchTreeTest',
@@ -20,9 +24,8 @@ CTBinarySearchTreeTest >> setUp [
2024
{ #category : 'tests' }
2125
CTBinarySearchTreeTest >> testAddMultipleElements [
2226

23-
tree add: 50.
24-
tree add: 30.
25-
tree add: 70.
27+
tree addAll: #(50 30 70).
28+
2629
self assert: tree size equals: 3
2730
]
2831

@@ -34,13 +37,163 @@ CTBinarySearchTreeTest >> testAddSingleElement [
3437
self assert: tree size equals: 1
3538
]
3639

40+
{ #category : 'tests' }
41+
CTBinarySearchTreeTest >> testAsArray [
42+
43+
44+
| result |
45+
tree addAll: #(50 30 70 20 40).
46+
47+
result := tree asArray.
48+
self assert: result equals: #(20 30 40 50 70)
49+
]
50+
51+
{ #category : 'tests' }
52+
CTBinarySearchTreeTest >> testBSTValidation [
53+
54+
| emptyTree |
55+
emptyTree := CTBinarySearchTree new.
56+
self assert: emptyTree validateBSTProperty.
57+
58+
tree addAll: #(50 30 70 20 40).
59+
self assert: tree validateBSTProperty.
60+
61+
"Test after removal"
62+
tree remove: 30.
63+
self assert: tree validateBSTProperty
64+
]
65+
66+
{ #category : 'tests' }
67+
CTBinarySearchTreeTest >> testClear [
68+
69+
tree addAll: #(1 2 3 4 5).
70+
tree clear.
71+
72+
self assert: tree isEmpty.
73+
self assert: tree size equals: 0
74+
]
75+
76+
{ #category : 'tests' }
77+
CTBinarySearchTreeTest >> testCollectionMethods [
78+
79+
| doubled evens found |
80+
tree addAll: #(50 30 70 20 40).
81+
82+
83+
doubled := tree collect: [ :each | each * 2 ].
84+
self assert: doubled asArray equals: #(40 60 80 100 140).
85+
86+
evens := tree select: [ :each | each even ].
87+
self assert: evens asArray equals: #(20 30 40 50 70).
88+
89+
found := tree detect: [ :each | each > 45 ] ifNone: [ nil ].
90+
self assert: found equals: 50.
91+
92+
self assert: (tree anySatisfy: [ :each | each > 60 ]).
93+
self deny: (tree anySatisfy: [ :each | each > 100 ])
94+
]
95+
96+
{ #category : 'tests' }
97+
CTBinarySearchTreeTest >> testCopy [
98+
99+
| copiedTree |
100+
tree addAll: #(50 30 70).
101+
copiedTree := tree copy.
102+
103+
self assert: copiedTree size equals: tree size.
104+
self assert: copiedTree asArray equals: tree asArray.
105+
106+
copiedTree add: 99.
107+
self deny: (tree includes: 99).
108+
self assert: (copiedTree includes: 99)
109+
]
110+
111+
{ #category : 'tests' }
112+
CTBinarySearchTreeTest >> testDoMethod [
113+
114+
| result |
115+
tree addAll: #(50 30 70 20 40).
116+
117+
result := OrderedCollection new.
118+
tree do: [ :each | result add: each ].
119+
120+
self assert: result asArray equals: #(20 30 40 50 70)
121+
]
122+
123+
{ #category : 'tests' }
124+
CTBinarySearchTreeTest >> testDuplicateHandling [
125+
126+
tree addAll: #( 42 42 50 ).
127+
128+
self assert: tree size equals: 2.
129+
130+
self assert: (tree includes: 42).
131+
self assert: (tree includes: 50)
132+
]
133+
134+
{ #category : 'tests' }
135+
CTBinarySearchTreeTest >> testElementsGreaterThan [
136+
137+
| result |
138+
tree addAll: #(50 30 70 20 40 60 80).
139+
140+
result := tree elementsGreaterThan: 45.
141+
self assert: result asArray equals: #(50 60 70 80).
142+
143+
result := tree elementsGreaterThan: 80.
144+
self assert: result isEmpty.
145+
146+
result := tree elementsGreaterThan: 10.
147+
self assert: result asArray equals: #(20 30 40 50 60 70 80)
148+
]
149+
150+
{ #category : 'tests' }
151+
CTBinarySearchTreeTest >> testElementsLessThan [
152+
153+
| result |
154+
tree addAll: #(50 30 70 20 40 60 80).
155+
156+
result := tree elementsLessThan: 45.
157+
self assert: result asArray equals: #(20 30 40).
158+
159+
result := tree elementsLessThan: 20.
160+
self assert: result isEmpty.
161+
162+
result := tree elementsLessThan: 90.
163+
self assert: result asArray equals: #(20 30 40 50 60 70 80)
164+
]
165+
37166
{ #category : 'tests' }
38167
CTBinarySearchTreeTest >> testEmpty [
39168

40169
self assert: tree isEmpty.
41170
self assert: tree size equals: 0
42171
]
43172

173+
{ #category : 'tests' }
174+
CTBinarySearchTreeTest >> testEmptyTreeOperations [
175+
176+
| result |
177+
self assert: tree isEmpty.
178+
self assert: tree findMin isNil.
179+
self assert: tree findMax isNil.
180+
self deny: (tree includes: 42).
181+
182+
result := tree collect: [ :each | each * 2 ].
183+
self assert: result isEmpty.
184+
185+
self deny: (tree anySatisfy: [ :each | true ])
186+
]
187+
188+
{ #category : 'tests' }
189+
CTBinarySearchTreeTest >> testFindMinMax [
190+
191+
tree addAll: #(50 30 70 20 80).
192+
193+
self assert: tree findMin equals: 20.
194+
self assert: tree findMax equals: 80
195+
]
196+
44197
{ #category : 'tests' }
45198
CTBinarySearchTreeTest >> testHeight [
46199

@@ -49,39 +202,31 @@ CTBinarySearchTreeTest >> testHeight [
49202
tree add: 50.
50203
self assert: tree height equals: 1.
51204

52-
tree add: 30.
53-
self assert: tree height equals: 2.
54-
55-
tree add: 70.
205+
tree addAll: #(30 70).
56206
self assert: tree height equals: 2
57207
]
58208

59209
{ #category : 'tests' }
60210
CTBinarySearchTreeTest >> testInOrderTraversal [
61211

62-
| result |
63-
tree add: 50.
64-
tree add: 30.
65-
tree add: 70.
66-
tree add: 20.
67-
tree add: 40.
68-
212+
| result |
213+
tree addAll: #(50 30 70 20 40).
214+
69215
result := OrderedCollection new.
70216
tree inOrderDo: [ :each | result add: each ].
71-
self assert: result asArray equals: #( 20 30 40 50 70 )
217+
218+
self assert: result asArray equals: #(20 30 40 50 70)
72219
]
73220

74221
{ #category : 'tests' }
75222
CTBinarySearchTreeTest >> testIncludes [
76223

77-
tree add: 50.
78-
tree add: 30.
79-
tree add: 70.
224+
tree addAll: #(50 30 70 20 40).
80225

81226
self assert: (tree includes: 50).
82227
self assert: (tree includes: 30).
83-
self assert: (tree includes: 70).
84-
self deny: (tree includes: 99)
228+
self deny: (tree includes: 99).
229+
self deny: (tree includes: 25)
85230
]
86231

87232
{ #category : 'tests' }
@@ -94,3 +239,147 @@ CTBinarySearchTreeTest >> testIsLeaf [
94239
self deny: tree root isLeaf.
95240
self assert: tree root left isLeaf
96241
]
242+
243+
{ #category : 'tests' }
244+
CTBinarySearchTreeTest >> testNegativeNumbersTree [
245+
246+
| result |
247+
tree addAll: #(-10 -5 0 5 10).
248+
249+
self assert: tree findMin equals: -10.
250+
self assert: tree findMax equals: 10.
251+
result := tree asArray.
252+
self assert: result equals: #(-10 -5 0 5 10)
253+
]
254+
255+
{ #category : 'tests' }
256+
CTBinarySearchTreeTest >> testPostOrderTraversal [
257+
258+
| result |
259+
tree addAll: #( 50 30 70 20 ).
260+
261+
result := OrderedCollection new.
262+
tree postOrderDo: [ :each | result add: each ].
263+
264+
self assert: result last equals: 50.
265+
self assert: result asArray equals: #( 20 30 70 50 )
266+
]
267+
268+
{ #category : 'tests' }
269+
CTBinarySearchTreeTest >> testPreOrderTraversal [
270+
271+
| result |
272+
tree addAll: #( 50 30 70 20 ).
273+
274+
result := OrderedCollection new.
275+
tree preOrderDo: [ :each | result add: each ].
276+
self assert: result first equals: 50.
277+
self assert: result asArray equals: #(50 30 20 70)
278+
]
279+
280+
{ #category : 'tests' }
281+
CTBinarySearchTreeTest >> testPredecessorSuccessorWithNonExistentElement [
282+
283+
tree addAll: #( 50 30 70 20 40 60 80 ).
284+
285+
self assert: (tree predecessorOf: 35) equals: 30.
286+
self assert: (tree successorOf: 35) equals: 40
287+
]
288+
289+
{ #category : 'tests' }
290+
CTBinarySearchTreeTest >> testPredecessors [
291+
292+
tree addAll: #( 50 30 70 20 40 60 80 ).
293+
294+
self assert: (tree predecessorOf: 50) equals: 40.
295+
self assert: (tree predecessorOf: 30) equals: 20.
296+
self assert: (tree predecessorOf: 20) isNil
297+
]
298+
299+
{ #category : 'tests' }
300+
CTBinarySearchTreeTest >> testRangeQuery [
301+
302+
| result temp |
303+
tree addAll: #( 50 30 70 20 40 60 80 ).
304+
305+
result := tree elementsFrom: 35 to: 65.
306+
temp := result asArray.
307+
self assert: result size equals: 3.
308+
self assert: temp equals: #(40 50 60).
309+
310+
"Test edge cases"
311+
result := tree elementsFrom: 10 to: 15.
312+
self assert: result isEmpty.
313+
314+
result := tree elementsFrom: 15 to: 5. "Invalid range"
315+
self assert: result isEmpty
316+
]
317+
318+
{ #category : 'tests' }
319+
CTBinarySearchTreeTest >> testRemoveLeafNode [
320+
321+
tree addAll: #(50 30 70 20).
322+
323+
tree remove: 20.
324+
self assert: tree size equals: 3.
325+
self deny: (tree includes: 20)
326+
]
327+
328+
{ #category : 'tests' }
329+
CTBinarySearchTreeTest >> testRemoveNodeWithOneChild [
330+
331+
tree addAll: #( 50 30 20 ).
332+
333+
tree remove: 30.
334+
self assert: tree size equals: 2.
335+
self deny: (tree includes: 30).
336+
self assert: (tree includes: 20)
337+
]
338+
339+
{ #category : 'tests' }
340+
CTBinarySearchTreeTest >> testRemoveNodeWithTwoChildren [
341+
342+
tree addAll: #(50 30 70 20 40).
343+
344+
tree remove: 30.
345+
self assert: tree size equals: 4.
346+
self deny: (tree includes: 30)
347+
]
348+
349+
{ #category : 'tests' }
350+
CTBinarySearchTreeTest >> testRemoveNonExistentElement [
351+
352+
| result |
353+
354+
tree addAll: #(50 30 70).
355+
result := tree remove: 99 ifAbsent: [ #notFound ].
356+
self assert: result equals: #notFound.
357+
self assert: tree size equals: 3.
358+
359+
self should: [ tree remove: 99 ] raise: Error
360+
]
361+
362+
{ #category : 'tests' }
363+
CTBinarySearchTreeTest >> testRemoveRoot [
364+
"Root with no children"
365+
tree add: 50.
366+
tree remove: 50.
367+
self assert: tree isEmpty.
368+
369+
"Root with two children"
370+
tree clear.
371+
tree addAll: #(50 30 70 20 40 60 80).
372+
tree remove: 50.
373+
self assert: tree size equals: 6.
374+
self deny: (tree includes: 50).
375+
]
376+
377+
{ #category : 'tests' }
378+
CTBinarySearchTreeTest >> testSuccessors [
379+
380+
tree addAll: #(50 30 70 20 40 60 80).
381+
382+
self assert: (tree successorOf: 50) equals: 60.
383+
self assert: (tree successorOf: 70) equals: 80.
384+
self assert: (tree successorOf: 80) isNil.
385+
]

0 commit comments

Comments
 (0)