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' , backend = Backend . CPP )
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,148 +172,162 @@ def test_AVLTree():
171
172
a .insert ('I' , 'I' )
172
173
a .insert ('A' , 'A' )
173
174
174
- trav = BinaryTreeTraversal (a , backend = Backend . CPP )
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
- # [0, -1, 0, 0, 0, 0, 0, -1, 0, 0]
182
- a1 = AVLTree (1 , 1 , backend = Backend . CPP )
181
+ assert [a .balance_factor (a . tree [ i ] ) for i in range ( a .tree . size ) if a . tree [ i ] is not None ] == \
182
+ [0 , - 1 , 0 , 0 , 0 , 0 , 0 , - 1 , 0 , 0 ]
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 , backend = Backend . CPP )
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 , backend = Backend . CPP )
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 , backend = Backend . CPP )
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 (backend = Backend . CPP )
207
+ a2 = AVLTree (backend = backend )
207
208
a2 .insert (1 , 1 )
208
209
a2 .insert (1 , 1 )
209
210
210
- trav = BinaryTreeTraversal (a2 , backend = Backend . CPP )
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 (backend = Backend .CPP )
217
- a3 .tree = ArrayForTrees (TreeNode , 0 )
218
- for i in range (7 ):
219
- a3 .tree .append (TreeNode (i , i ))
217
+ a3 = AVLTree (0 ,0 ,backend = backend )
218
+ for i in range (1 ,7 ):
219
+ a3 .tree .append (TreeNode (i , i , backend = backend ))
220
220
a3 .tree [0 ].left = 1
221
- # print(str(a3))
222
221
a3 .tree [0 ].right = 6
223
222
a3 .tree [1 ].left = 5
224
223
a3 .tree [1 ].right = 2
225
224
a3 .tree [2 ].left = 3
226
225
a3 .tree [2 ].right = 4
227
- # print(str(a3))
228
- # a3._left_right_rotate(0, 1)
226
+ a3 ._left_right_rotate (0 , 1 )
229
227
230
- # trav = BinaryTreeTraversal(a3)
231
- # in_order = trav.depth_first_search(order='in_order')
232
- # pre_order = trav.depth_first_search(order='pre_order')
233
- # assert [node.key for node in in_order] == [5, 1, 3, 2, 4, 0, 6]
234
- # assert [node.key for node in pre_order] == [2, 1, 5, 3, 0, 4, 6]
235
-
236
- # a4 = AVLTree()
237
- # a4.tree = ArrayForTrees(TreeNode, 0)
238
- # for i in range(7):
239
- # a4.tree.append(TreeNode(i, i))
240
- # a4.tree[0].left = 1
241
- # a4.tree[0].right = 2
242
- # a4.tree[2].left = 3
243
- # a4.tree[2].right = 4
244
- # a4.tree[3].left = 5
245
- # a4.tree[3].right = 6
246
- # a4._right_left_rotate(0, 2)
247
-
248
- # trav = BinaryTreeTraversal(a4)
249
- # in_order = trav.depth_first_search(order='in_order')
250
- # pre_order = trav.depth_first_search(order='pre_order')
251
- # assert [node.key for node in in_order] == [1, 0, 5, 3, 6, 2, 4]
252
- # assert [node.key for node in pre_order] == [3,0,1,5,2,6,4]
253
-
254
- # a5 = AVLTree(is_order_statistic=True)
255
- # a5.tree = ArrayForTrees(TreeNode, [
256
- # TreeNode(10, 10),
257
- # TreeNode(5, 5),
258
- # TreeNode(17, 17),
259
- # TreeNode(2, 2),
260
- # TreeNode(9, 9),
261
- # TreeNode(12, 12),
262
- # TreeNode(20, 20),
263
- # TreeNode(3, 3),
264
- # TreeNode(11, 11),
265
- # TreeNode(15, 15),
266
- # TreeNode(18, 18),
267
- # TreeNode(30, 30),
268
- # TreeNode(13, 13),
269
- # TreeNode(33, 33)
270
- # ])
271
-
272
- # a5.tree[0].left, a5.tree[0].right, a5.tree[0].parent, a5.tree[0].height = \
273
- # 1, 2, None, 4
274
- # a5.tree[1].left, a5.tree[1].right, a5.tree[1].parent, a5.tree[1].height = \
275
- # 3, 4, 0, 2
276
- # a5.tree[2].left, a5.tree[2].right, a5.tree[2].parent, a5.tree[2].height = \
277
- # 5, 6, 0, 3
278
- # a5.tree[3].left, a5.tree[3].right, a5.tree[3].parent, a5.tree[3].height = \
279
- # None, 7, 1, 1
280
- # a5.tree[4].left, a5.tree[4].right, a5.tree[4].parent, a5.tree[4].height = \
281
- # None, None, 1, 0
282
- # a5.tree[5].left, a5.tree[5].right, a5.tree[5].parent, a5.tree[5].height = \
283
- # 8, 9, 2, 2
284
- # a5.tree[6].left, a5.tree[6].right, a5.tree[6].parent, a5.tree[6].height = \
285
- # 10, 11, 2, 2
286
- # a5.tree[7].left, a5.tree[7].right, a5.tree[7].parent, a5.tree[7].height = \
287
- # None, None, 3, 0
288
- # a5.tree[8].left, a5.tree[8].right, a5.tree[8].parent, a5.tree[8].height = \
289
- # None, None, 5, 0
290
- # a5.tree[9].left, a5.tree[9].right, a5.tree[9].parent, a5.tree[9].height = \
291
- # 12, None, 5, 1
292
- # a5.tree[10].left, a5.tree[10].right, a5.tree[10].parent, a5.tree[10].height = \
293
- # None, None, 6, 0
294
- # a5.tree[11].left, a5.tree[11].right, a5.tree[11].parent, a5.tree[11].height = \
295
- # None, 13, 6, 1
296
- # a5.tree[12].left, a5.tree[12].right, a5.tree[12].parent, a5.tree[12].height = \
297
- # None, None, 9, 0
298
- # a5.tree[13].left, a5.tree[13].right, a5.tree[13].parent, a5.tree[13].height = \
299
- # None, None, 11, 0
228
+ trav = BinaryTreeTraversal (a3 , backend = backend )
229
+ in_order = trav .depth_first_search (order = 'in_order' )
230
+ pre_order = trav .depth_first_search (order = 'pre_order' )
231
+ assert [node .key for node in in_order ] == [5 , 1 , 3 , 2 , 4 , 0 , 6 ]
232
+ assert [node .key for node in pre_order ] == [2 , 1 , 5 , 3 , 0 , 4 , 6 ]
233
+
234
+ a4 = AVLTree (0 ,0 ,backend = backend )
235
+ for i in range (1 ,7 ):
236
+ a4 .tree .append (TreeNode (i , i ,backend = backend ))
237
+ a4 .tree [0 ].left = 1
238
+ a4 .tree [0 ].right = 2
239
+ a4 .tree [2 ].left = 3
240
+ a4 .tree [2 ].right = 4
241
+ a4 .tree [3 ].left = 5
242
+ a4 .tree [3 ].right = 6
243
+ a4 ._right_left_rotate (0 , 2 )
244
+
245
+ trav = BinaryTreeTraversal (a4 , backend = backend )
246
+ in_order = trav .depth_first_search (order = 'in_order' )
247
+ pre_order = trav .depth_first_search (order = 'pre_order' )
248
+ assert [node .key for node in in_order ] == [1 , 0 , 5 , 3 , 6 , 2 , 4 ]
249
+ assert [node .key for node in pre_order ] == [3 ,0 ,1 ,5 ,2 ,6 ,4 ]
250
+
251
+ a5 = AVLTree (is_order_statistic = True ,backend = backend )
252
+ if backend == Backend .PYTHON :
253
+ a5 .tree = ArrayForTrees (TreeNode , [
254
+ TreeNode (10 , 10 ),
255
+ TreeNode (5 , 5 ),
256
+ TreeNode (17 , 17 ),
257
+ TreeNode (2 , 2 ),
258
+ TreeNode (9 , 9 ),
259
+ TreeNode (12 , 12 ),
260
+ TreeNode (20 , 20 ),
261
+ TreeNode (3 , 3 ),
262
+ TreeNode (11 , 11 ),
263
+ TreeNode (15 , 15 ),
264
+ TreeNode (18 , 18 ),
265
+ TreeNode (30 , 30 ),
266
+ TreeNode (13 , 13 ),
267
+ TreeNode (33 , 33 )
268
+ ])
269
+ else :
270
+ a5 .tree = ArrayForTrees (_nodes .TreeNode , [
271
+ TreeNode (10 , 10 ,backend = backend ),
272
+ TreeNode (5 , 5 ,backend = backend ),
273
+ TreeNode (17 , 17 ,backend = backend ),
274
+ TreeNode (2 , 2 ,backend = backend ),
275
+ TreeNode (9 , 9 ,backend = backend ),
276
+ TreeNode (12 , 12 ,backend = backend ),
277
+ TreeNode (20 , 20 ,backend = backend ),
278
+ TreeNode (3 , 3 ,backend = backend ),
279
+ TreeNode (11 , 11 ,backend = backend ),
280
+ TreeNode (15 , 15 ,backend = backend ),
281
+ TreeNode (18 , 18 ,backend = backend ),
282
+ TreeNode (30 , 30 ,backend = backend ),
283
+ TreeNode (13 , 13 ,backend = backend ),
284
+ TreeNode (33 , 33 ,backend = backend )
285
+ ],backend = backend )
286
+
287
+ a5 .tree [0 ].left , a5 .tree [0 ].right , a5 .tree [0 ].parent , a5 .tree [0 ].height = \
288
+ 1 , 2 , None , 4
289
+ a5 .tree [1 ].left , a5 .tree [1 ].right , a5 .tree [1 ].parent , a5 .tree [1 ].height = \
290
+ 3 , 4 , 0 , 2
291
+ a5 .tree [2 ].left , a5 .tree [2 ].right , a5 .tree [2 ].parent , a5 .tree [2 ].height = \
292
+ 5 , 6 , 0 , 3
293
+ a5 .tree [3 ].left , a5 .tree [3 ].right , a5 .tree [3 ].parent , a5 .tree [3 ].height = \
294
+ None , 7 , 1 , 1
295
+ a5 .tree [4 ].left , a5 .tree [4 ].right , a5 .tree [4 ].parent , a5 .tree [4 ].height = \
296
+ None , None , 1 , 0
297
+ a5 .tree [5 ].left , a5 .tree [5 ].right , a5 .tree [5 ].parent , a5 .tree [5 ].height = \
298
+ 8 , 9 , 2 , 2
299
+ a5 .tree [6 ].left , a5 .tree [6 ].right , a5 .tree [6 ].parent , a5 .tree [6 ].height = \
300
+ 10 , 11 , 2 , 2
301
+ a5 .tree [7 ].left , a5 .tree [7 ].right , a5 .tree [7 ].parent , a5 .tree [7 ].height = \
302
+ None , None , 3 , 0
303
+ a5 .tree [8 ].left , a5 .tree [8 ].right , a5 .tree [8 ].parent , a5 .tree [8 ].height = \
304
+ None , None , 5 , 0
305
+ a5 .tree [9 ].left , a5 .tree [9 ].right , a5 .tree [9 ].parent , a5 .tree [9 ].height = \
306
+ 12 , None , 5 , 1
307
+ a5 .tree [10 ].left , a5 .tree [10 ].right , a5 .tree [10 ].parent , a5 .tree [10 ].height = \
308
+ None , None , 6 , 0
309
+ a5 .tree [11 ].left , a5 .tree [11 ].right , a5 .tree [11 ].parent , a5 .tree [11 ].height = \
310
+ None , 13 , 6 , 1
311
+ a5 .tree [12 ].left , a5 .tree [12 ].right , a5 .tree [12 ].parent , a5 .tree [12 ].height = \
312
+ None , None , 9 , 0
313
+ a5 .tree [13 ].left , a5 .tree [13 ].right , a5 .tree [13 ].parent , a5 .tree [13 ].height = \
314
+ None , None , 11 , 0
300
315
301
316
# # testing order statistics
302
- # a5.tree[0].size = 14
303
- # a5.tree[1].size = 4
304
- # a5.tree[2].size = 9
305
- # a5.tree[3].size = 2
306
- # a5.tree[4].size = 1
307
- # a5.tree[5].size = 4
308
- # a5.tree[6].size = 4
309
- # a5.tree[7].size = 1
310
- # a5.tree[8].size = 1
311
- # a5.tree[9].size = 2
312
- # a5.tree[10].size = 1
313
- # a5.tree[11].size = 2
314
- # a5.tree[12].size = 1
315
- # a5.tree[13].size = 1
317
+ a5 .tree [0 ].size = 14
318
+ a5 .tree [1 ].size = 4
319
+ a5 .tree [2 ].size = 9
320
+ a5 .tree [3 ].size = 2
321
+ a5 .tree [4 ].size = 1
322
+ a5 .tree [5 ].size = 4
323
+ a5 .tree [6 ].size = 4
324
+ a5 .tree [7 ].size = 1
325
+ a5 .tree [8 ].size = 1
326
+ a5 .tree [9 ].size = 2
327
+ a5 .tree [10 ].size = 1
328
+ a5 .tree [11 ].size = 2
329
+ a5 .tree [12 ].size = 1
330
+ a5 .tree [13 ].size = 1
316
331
317
332
# assert raises(ValueError, lambda: a5.select(0))
318
333
# assert raises(ValueError, lambda: a5.select(15))
@@ -361,7 +376,15 @@ def test_AVLTree():
361
376
# test_select_rank([2])
362
377
# a5.delete(2)
363
378
# test_select_rank([])
379
+
380
+ def test_AVLTree ():
381
+ _test_AVLTree (backend = Backend .PYTHON )
382
+
383
+ def test_cpp_AVLTree ():
384
+ _test_AVLTree (backend = Backend .CPP )
385
+
364
386
test_AVLTree ()
387
+ test_cpp_AVLTree ()
365
388
366
389
def _test_BinaryIndexedTree (backend ):
367
390
0 commit comments