6
6
from copy import deepcopy
7
7
from pydatastructs .utils .misc_util import Backend
8
8
import random
9
+ from pydatastructs .utils ._backend .cpp import _nodes
9
10
10
11
def _test_BinarySearchTree (backend ):
11
12
BST = BinarySearchTree
@@ -159,8 +160,8 @@ def test_BinaryTreeTraversal():
159
160
def test_cpp_BinaryTreeTraversal ():
160
161
_test_BinaryTreeTraversal (Backend .CPP )
161
162
162
- def test_AVLTree ( ):
163
- a = AVLTree ('M' , 'M' )
163
+ def _test_AVLTree ( backend ):
164
+ a = AVLTree ('M' , 'M' , backend = backend )
164
165
a .insert ('N' , 'N' )
165
166
a .insert ('O' , 'O' )
166
167
a .insert ('L' , 'L' )
@@ -171,70 +172,71 @@ def test_AVLTree():
171
172
a .insert ('I' , 'I' )
172
173
a .insert ('A' , 'A' )
173
174
174
- trav = BinaryTreeTraversal (a )
175
+ trav = BinaryTreeTraversal (a , backend = backend )
175
176
in_order = trav .depth_first_search (order = 'in_order' )
176
177
pre_order = trav .depth_first_search (order = 'pre_order' )
177
178
assert [node .key for node in in_order ] == ['A' , 'H' , 'I' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' ]
178
179
assert [node .key for node in pre_order ] == ['N' , 'I' , 'H' , 'A' , 'L' , 'K' , 'M' , 'P' , 'O' , 'Q' ]
179
180
180
- assert [a .balance_factor (n ) for n in a .tree if n is not None ] == \
181
+ assert [a .balance_factor (a . tree [ i ] ) for i in range ( a .tree . size ) if a . tree [ i ] is not None ] == \
181
182
[0 , - 1 , 0 , 0 , 0 , 0 , 0 , - 1 , 0 , 0 ]
182
- a1 = AVLTree (1 , 1 )
183
+ a1 = AVLTree (1 , 1 , backend = backend )
183
184
a1 .insert (2 , 2 )
184
185
a1 .insert (3 , 3 )
185
186
a1 .insert (4 , 4 )
186
187
a1 .insert (5 , 5 )
187
188
188
- trav = BinaryTreeTraversal (a1 )
189
+ trav = BinaryTreeTraversal (a1 , backend = backend )
189
190
in_order = trav .depth_first_search (order = 'in_order' )
190
191
pre_order = trav .depth_first_search (order = 'pre_order' )
191
192
assert [node .key for node in in_order ] == [1 , 2 , 3 , 4 , 5 ]
192
193
assert [node .key for node in pre_order ] == [2 , 1 , 4 , 3 , 5 ]
193
194
194
- a3 = AVLTree (- 1 , 1 )
195
+ a3 = AVLTree (- 1 , 1 , backend = backend )
195
196
a3 .insert (- 2 , 2 )
196
197
a3 .insert (- 3 , 3 )
197
198
a3 .insert (- 4 , 4 )
198
199
a3 .insert (- 5 , 5 )
199
200
200
- trav = BinaryTreeTraversal (a3 )
201
+ trav = BinaryTreeTraversal (a3 , backend = backend )
201
202
in_order = trav .depth_first_search (order = 'in_order' )
202
203
pre_order = trav .depth_first_search (order = 'pre_order' )
203
204
assert [node .key for node in in_order ] == [- 5 , - 4 , - 3 , - 2 , - 1 ]
204
205
assert [node .key for node in pre_order ] == [- 2 , - 4 , - 5 , - 3 , - 1 ]
205
206
206
- a2 = AVLTree ()
207
+ a2 = AVLTree (backend = backend )
207
208
a2 .insert (1 , 1 )
208
209
a2 .insert (1 , 1 )
209
210
210
- trav = BinaryTreeTraversal (a2 )
211
+ trav = BinaryTreeTraversal (a2 , backend = backend )
211
212
in_order = trav .depth_first_search (order = 'in_order' )
212
213
pre_order = trav .depth_first_search (order = 'pre_order' )
213
214
assert [node .key for node in in_order ] == [1 ]
214
215
assert [node .key for node in pre_order ] == [1 ]
215
216
216
- a3 = AVLTree ()
217
- a3 .tree = ArrayForTrees (TreeNode , 0 )
218
- for i in range (7 ):
219
- a3 .tree .append (TreeNode (i , i ))
217
+ a3 = AVLTree (backend = backend )
218
+ a3 .set_tree ( ArrayForTrees (TreeNode , 0 , backend = backend ) )
219
+ for i in range (0 , 7 ):
220
+ a3 .tree .append (TreeNode (i , i , backend = backend ))
220
221
a3 .tree [0 ].left = 1
221
222
a3 .tree [0 ].right = 6
222
223
a3 .tree [1 ].left = 5
223
224
a3 .tree [1 ].right = 2
224
225
a3 .tree [2 ].left = 3
225
226
a3 .tree [2 ].right = 4
226
227
a3 ._left_right_rotate (0 , 1 )
228
+ assert str (a3 ) == "[(4, 0, 0, 6), (5, 1, 1, 3), (1, 2, 2, 0), (None, 3, 3, None), (None, 4, 4, None), (None, 5, 5, None), (None, 6, 6, None)]"
227
229
228
- trav = BinaryTreeTraversal (a3 )
230
+ trav = BinaryTreeTraversal (a3 , backend = backend )
229
231
in_order = trav .depth_first_search (order = 'in_order' )
230
232
pre_order = trav .depth_first_search (order = 'pre_order' )
231
233
assert [node .key for node in in_order ] == [5 , 1 , 3 , 2 , 4 , 0 , 6 ]
232
234
assert [node .key for node in pre_order ] == [2 , 1 , 5 , 3 , 0 , 4 , 6 ]
233
235
234
- a4 = AVLTree ()
235
- a4 .tree = ArrayForTrees (TreeNode , 0 )
236
- for i in range (7 ):
237
- a4 .tree .append (TreeNode (i , i ))
236
+ a4 = AVLTree (backend = backend )
237
+ a4 .set_tree ( ArrayForTrees (TreeNode , 0 , backend = backend ) )
238
+ for i in range (0 , 7 ):
239
+ a4 .tree .append (TreeNode (i , i , backend = backend ))
238
240
a4 .tree [0 ].left = 1
239
241
a4 .tree [0 ].right = 2
240
242
a4 .tree [2 ].left = 3
@@ -243,14 +245,15 @@ def test_AVLTree():
243
245
a4 .tree [3 ].right = 6
244
246
a4 ._right_left_rotate (0 , 2 )
245
247
246
- trav = BinaryTreeTraversal (a4 )
248
+ trav = BinaryTreeTraversal (a4 , backend = backend )
247
249
in_order = trav .depth_first_search (order = 'in_order' )
248
250
pre_order = trav .depth_first_search (order = 'pre_order' )
249
251
assert [node .key for node in in_order ] == [1 , 0 , 5 , 3 , 6 , 2 , 4 ]
250
252
assert [node .key for node in pre_order ] == [3 ,0 ,1 ,5 ,2 ,6 ,4 ]
251
253
252
- a5 = AVLTree (is_order_statistic = True )
253
- a5 .tree = ArrayForTrees (TreeNode , [
254
+ a5 = AVLTree (is_order_statistic = True ,backend = backend )
255
+ if backend == Backend .PYTHON :
256
+ a5 .set_tree ( ArrayForTrees (TreeNode , [
254
257
TreeNode (10 , 10 ),
255
258
TreeNode (5 , 5 ),
256
259
TreeNode (17 , 17 ),
@@ -265,7 +268,24 @@ def test_AVLTree():
265
268
TreeNode (30 , 30 ),
266
269
TreeNode (13 , 13 ),
267
270
TreeNode (33 , 33 )
268
- ])
271
+ ]) )
272
+ else :
273
+ a5 .set_tree ( ArrayForTrees (_nodes .TreeNode , [
274
+ TreeNode (10 , 10 ,backend = backend ),
275
+ TreeNode (5 , 5 ,backend = backend ),
276
+ TreeNode (17 , 17 ,backend = backend ),
277
+ TreeNode (2 , 2 ,backend = backend ),
278
+ TreeNode (9 , 9 ,backend = backend ),
279
+ TreeNode (12 , 12 ,backend = backend ),
280
+ TreeNode (20 , 20 ,backend = backend ),
281
+ TreeNode (3 , 3 ,backend = backend ),
282
+ TreeNode (11 , 11 ,backend = backend ),
283
+ TreeNode (15 , 15 ,backend = backend ),
284
+ TreeNode (18 , 18 ,backend = backend ),
285
+ TreeNode (30 , 30 ,backend = backend ),
286
+ TreeNode (13 , 13 ,backend = backend ),
287
+ TreeNode (33 , 33 ,backend = backend )
288
+ ],backend = backend ) )
269
289
270
290
a5 .tree [0 ].left , a5 .tree [0 ].right , a5 .tree [0 ].parent , a5 .tree [0 ].height = \
271
291
1 , 2 , None , 4
@@ -311,16 +331,18 @@ def test_AVLTree():
311
331
a5 .tree [11 ].size = 2
312
332
a5 .tree [12 ].size = 1
313
333
a5 .tree [13 ].size = 1
334
+ assert str (a5 ) == "[(1, 10, 10, 2), (3, 5, 5, 4), (5, 17, 17, 6), (None, 2, 2, 7), (None, 9, 9, None), (8, 12, 12, 9), (10, 20, 20, 11), (None, 3, 3, None), (None, 11, 11, None), (12, 15, 15, None), (None, 18, 18, None), (None, 30, 30, 13), (None, 13, 13, None), (None, 33, 33, None)]"
314
335
315
336
assert raises (ValueError , lambda : a5 .select (0 ))
316
337
assert raises (ValueError , lambda : a5 .select (15 ))
338
+
317
339
assert a5 .rank (- 1 ) is None
318
340
def test_select_rank (expected_output ):
319
- output = []
320
- for i in range ( len ( expected_output )):
321
- output . append ( a5 . select ( i + 1 ). key )
322
- assert output == expected_output
323
-
341
+ if backend == Backend . PYTHON :
342
+ output = []
343
+ for i in range ( len ( expected_output )):
344
+ output . append ( a5 . select ( i + 1 ). key )
345
+ assert output == expected_output
324
346
output = []
325
347
expected_ranks = [i + 1 for i in range (len (expected_output ))]
326
348
for i in range (len (expected_output )):
@@ -331,8 +353,9 @@ def test_select_rank(expected_output):
331
353
a5 .delete (9 )
332
354
a5 .delete (13 )
333
355
a5 .delete (20 )
356
+ assert str (a5 ) == "[(7, 10, 10, 5), (None, 5, 5, None), (0, 17, 17, 6), (None, 2, 2, None), '', (8, 12, 12, 9), (10, 30, 30, 13), (3, 3, 3, 1), (None, 11, 11, None), (None, 15, 15, None), (None, 18, 18, None), '', '', (None, 33, 33, None)]"
334
357
335
- trav = BinaryTreeTraversal (a5 )
358
+ trav = BinaryTreeTraversal (a5 , backend = backend )
336
359
in_order = trav .depth_first_search (order = 'in_order' )
337
360
pre_order = trav .depth_first_search (order = 'pre_order' )
338
361
assert [node .key for node in in_order ] == [2 , 3 , 5 , 10 , 11 , 12 , 15 , 17 , 18 , 30 , 33 ]
@@ -341,6 +364,7 @@ def test_select_rank(expected_output):
341
364
test_select_rank ([2 , 3 , 5 , 10 , 11 , 12 , 15 , 17 , 18 , 30 , 33 ])
342
365
a5 .delete (10 )
343
366
a5 .delete (17 )
367
+ assert str (a5 ) == "[(7, 11, 11, 5), (None, 5, 5, None), (0, 18, 18, 6), (None, 2, 2, None), '', (None, 12, 12, 9), (None, 30, 30, 13), (3, 3, 3, 1), '', (None, 15, 15, None), '', '', '', (None, 33, 33, None)]"
344
368
test_select_rank ([2 , 3 , 5 , 11 , 12 , 15 , 18 , 30 , 33 ])
345
369
a5 .delete (11 )
346
370
a5 .delete (30 )
@@ -359,8 +383,13 @@ def test_select_rank(expected_output):
359
383
test_select_rank ([2 ])
360
384
a5 .delete (2 )
361
385
test_select_rank ([])
386
+ assert str (a5 ) == "[(None, None, None, None)]"
362
387
363
-
388
+ def test_AVLTree ():
389
+ _test_AVLTree (backend = Backend .PYTHON )
390
+ def test_cpp_AVLTree ():
391
+ _test_AVLTree (backend = Backend .CPP )
392
+ test_cpp_AVLTree ()
364
393
def _test_BinaryIndexedTree (backend ):
365
394
366
395
FT = BinaryIndexedTree
0 commit comments