Skip to content

Commit 079895e

Browse files
authored
Merge pull request #38 from HossamSaberr/main
Optimize copy method from O(N log N) to O(N)
2 parents 7fe0bf5 + da9dc67 commit 079895e

File tree

4 files changed

+106
-9
lines changed

4 files changed

+106
-9
lines changed

src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,93 @@ CTAVLTreeTest >> testCopy [
119119
self assert: (copiedTree includes: 99)
120120
]
121121

122+
{ #category : 'tests' }
123+
CTAVLTreeTest >> testCopyEmptyTree [
124+
| copiedTree |
125+
126+
copiedTree := tree copy.
127+
128+
self assert: copiedTree isEmpty.
129+
self assert: copiedTree size equals: 0.
130+
self assert: copiedTree height equals: 0.
131+
132+
self deny: copiedTree == tree.
133+
]
134+
135+
{ #category : 'tests' }
136+
CTAVLTreeTest >> testCopyLargeTree [
137+
| copiedTree elements |
138+
139+
elements := (1 to: 1000) asArray shuffled.
140+
tree addAll: elements.
141+
142+
copiedTree := tree copy.
143+
144+
self assert: copiedTree size equals: 1000.
145+
self assert: copiedTree height equals: tree height.
146+
self assert: copiedTree validate.
147+
148+
self assert: copiedTree asArray equals: tree asArray.
149+
]
150+
151+
{ #category : 'tests' }
152+
CTAVLTreeTest >> testCopyLeafNode [
153+
| node copiedNode |
154+
node := CTAVLNode new contents: 42.
155+
156+
copiedNode := node copy.
157+
158+
self assert: copiedNode contents equals: 42.
159+
self deny: node == copiedNode.
160+
161+
self assert: copiedNode height equals: 1.
162+
self assert: copiedNode left isNilNode.
163+
self assert: copiedNode right isNilNode
164+
]
165+
166+
{ #category : 'tests' }
167+
CTAVLTreeTest >> testCopySingleNode [
168+
| copiedTree |
169+
170+
tree add: 42.
171+
copiedTree := tree copy.
172+
173+
self assert: copiedTree size equals: 1.
174+
self assert: copiedTree height equals: 1.
175+
self assert: copiedTree root contents equals: 42.
176+
177+
self deny: copiedTree root == tree root.
178+
self assert: copiedTree validate.
179+
]
180+
181+
{ #category : 'tests' }
182+
CTAVLTreeTest >> testCopyStructureAndIsolation [
183+
| copiedTree |
184+
185+
tree addAll: #(50 30 70 20 40 60 80).
186+
copiedTree := tree copy.
187+
188+
self assert: copiedTree size equals: tree size.
189+
self assert: copiedTree height equals: tree height.
190+
self assert: copiedTree asArray equals: tree asArray.
191+
self assert: copiedTree validate.
192+
193+
self deny: copiedTree root == tree root.
194+
self deny: copiedTree root left == tree root left.
195+
196+
copiedTree add: 99.
197+
copiedTree remove: 20.
198+
199+
self assert: (copiedTree includes: 99).
200+
self deny: (tree includes: 99).
201+
202+
self deny: (copiedTree includes: 20).
203+
self assert: (tree includes: 20).
204+
205+
self assert: tree validate.
206+
self assert: copiedTree validate.
207+
]
208+
122209
{ #category : 'tests' }
123210
CTAVLTreeTest >> testDetect [
124211

src/Containers-AVL-Tree/CTAVLNilNode.class.st

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ CTAVLNilNode >> contents: anObject [
3737
"Do nothing for nil node"
3838
]
3939

40+
{ #category : 'copying' }
41+
CTAVLNilNode >> copy [
42+
^ self class new
43+
]
44+
4045
{ #category : 'enumerating' }
4146
CTAVLNilNode >> elementsFrom: min to: max into: aCollection [
4247

src/Containers-AVL-Tree/CTAVLNode.class.st

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,14 @@ CTAVLNode >> left: aNode [
173173
aNode ifNotNil: [ aNode parent: self ]
174174
]
175175

176+
{ #category : 'copying' }
177+
CTAVLNode >> postCopy [
178+
super postCopy.
179+
180+
left isNilNode ifFalse: [ left := left copy ].
181+
right isNilNode ifFalse: [ right := right copy ]
182+
]
183+
176184
{ #category : 'enumerating' }
177185
CTAVLNode >> postOrderDo: aBlock [
178186

src/Containers-AVL-Tree/CTAVLTree.class.st

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,6 @@ CTAVLTree >> collect: aBlock [
9292
^ result
9393
]
9494

95-
{ #category : 'copying' }
96-
CTAVLTree >> copy [
97-
98-
| newTree |
99-
newTree := self class new.
100-
self inOrderDo: [ :each | newTree add: each ].
101-
^ newTree
102-
]
103-
10495
{ #category : 'enumerating' }
10596
CTAVLTree >> detect: aBlock ifNone: absentBlock [
10697

@@ -236,6 +227,12 @@ CTAVLTree >> last [
236227
^ self findMax
237228
]
238229

230+
{ #category : 'copying' }
231+
CTAVLTree >> postCopy [
232+
super postCopy.
233+
root := root copy.
234+
]
235+
239236
{ #category : 'enumerating' }
240237
CTAVLTree >> postOrderDo: aBlock [
241238

0 commit comments

Comments
 (0)