@@ -19,10 +19,18 @@ def test_BinarySearchTree():
1919 b .insert (7 , 7 )
2020 b .insert (14 , 14 )
2121 b .insert (13 , 13 )
22+ # Explicit check for the __str__ method of Binary Trees Class
2223 assert str (b ) == \
2324 ("[(1, 8, 8, 2), (3, 3, 3, 4), (None, 10, 10, 7), (None, 1, 1, None), "
2425 "(5, 6, 6, 6), (None, 4, 4, None), (None, 7, 7, None), (8, 14, 14, None), "
2526 "(None, 13, 13, None)]" )
27+
28+ trav = BinaryTreeTraversal (b )
29+ in_order = trav .depth_first_search (order = 'in_order' )
30+ pre_order = trav .depth_first_search (order = 'pre_order' )
31+ assert [node .key for node in in_order ] == [1 , 3 , 4 , 6 , 7 , 8 , 10 , 13 , 14 ]
32+ assert [node .key for node in pre_order ] == [8 , 3 , 1 , 6 , 4 , 7 , 10 , 14 , 13 ]
33+
2634 assert b .search (10 ) == 2
2735 assert b .search (- 1 ) is None
2836 assert b .delete (13 ) is True
@@ -32,16 +40,25 @@ def test_BinarySearchTree():
3240 assert b .delete (3 ) is True
3341 assert b .search (3 ) is None
3442 assert b .delete (13 ) is None
35- assert str (b ) == \
36- ("[(1, 8, 8, 7), (3, 4, 4, 4), '', (None, 1, 1, None), "
37- "(None, 6, 6, 6), '', (None, 7, 7, None), (None, 14, 14, None)]" )
43+
44+ in_order = trav .depth_first_search (order = 'in_order' )
45+ pre_order = trav .depth_first_search (order = 'pre_order' )
46+ assert [node .key for node in in_order ] == [1 , 4 , 6 , 7 , 8 , 14 ]
47+ assert [node .key for node in pre_order ] == [8 , 4 , 1 , 6 , 7 , 14 ]
48+
3849 b .delete (7 )
3950 b .delete (6 )
4051 b .delete (1 )
4152 b .delete (4 )
42- assert str (b ) == "[(None, 8, 8, 2), '', (None, 14, 14, None)]"
53+
54+ in_order = trav .depth_first_search (order = 'in_order' )
55+ pre_order = trav .depth_first_search (order = 'pre_order' )
56+ assert [node .key for node in in_order ] == [8 , 14 ]
57+ assert [node .key for node in pre_order ] == [8 , 14 ]
58+
4359 bc = BST (1 , 1 )
4460 assert bc .insert (1 , 2 ) is None
61+
4562 b = BST (- 8 , 8 )
4663 b .insert (- 3 , 3 )
4764 b .insert (- 10 , 10 )
@@ -102,32 +119,20 @@ def test_BinaryTreeTraversal():
102119 b .insert ('H' , 'H' )
103120 trav = BTT (b )
104121 pre = trav .depth_first_search (order = 'pre_order' )
105- assert [str (n ) for n in pre ] == \
106- ["(1, 'F', 'F', 3)" , "(2, 'B', 'B', 4)" , "(None, 'A', 'A', None)" ,
107- "(5, 'D', 'D', 6)" , "(None, 'C', 'C', None)" , "(None, 'E', 'E', None)" ,
108- "(None, 'G', 'G', 7)" , "(8, 'I', 'I', None)" , "(None, 'H', 'H', None)" ]
122+ assert [node .key for node in pre ] == ['F' , 'B' , 'A' , 'D' , 'C' , 'E' , 'G' , 'I' , 'H' ]
123+
109124 ino = trav .depth_first_search ()
110- assert [str (n ) for n in ino ] == \
111- ["(None, 'A', 'A', None)" , "(2, 'B', 'B', 4)" , "(None, 'C', 'C', None)" ,
112- "(5, 'D', 'D', 6)" , "(None, 'E', 'E', None)" , "(1, 'F', 'F', 3)" ,
113- "(None, 'G', 'G', 7)" , "(None, 'H', 'H', None)" , "(8, 'I', 'I', None)" ]
125+ assert [node .key for node in ino ] == ['A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' ]
126+
114127 out = trav .depth_first_search (order = 'out_order' )
115- assert [str (n ) for n in out ] == \
116- ["(8, 'I', 'I', None)" , "(None, 'H', 'H', None)" , "(None, 'G', 'G', 7)" ,
117- "(1, 'F', 'F', 3)" , "(None, 'E', 'E', None)" , "(5, 'D', 'D', 6)" ,
118- "(None, 'C', 'C', None)" , "(2, 'B', 'B', 4)" , "(None, 'A', 'A', None)" ]
128+ assert [node .key for node in out ] == ['I' , 'H' , 'G' , 'F' , 'E' , 'D' , 'C' , 'B' , 'A' ]
129+
119130 post = trav .depth_first_search (order = 'post_order' )
120- assert [str (n ) for n in post ] == \
121- ["(None, 'A', 'A', None)" , "(None, 'C', 'C', None)" ,
122- "(None, 'E', 'E', None)" , "(5, 'D', 'D', 6)" , "(2, 'B', 'B', 4)" ,
123- "(None, 'H', 'H', None)" , "(8, 'I', 'I', None)" , "(None, 'G', 'G', 7)" ,
124- "(1, 'F', 'F', 3)" ]
131+ assert [node .key for node in post ] == ['A' , 'C' , 'E' , 'D' , 'B' , 'H' , 'I' , 'G' , 'F' ]
132+
125133 bfs = trav .breadth_first_search ()
126- assert [str (n ) for n in bfs ] == \
127- ["(1, 'F', 'F', 3)" , "(2, 'B', 'B', 4)" , "(None, 'G', 'G', 7)" ,
128- "(None, 'A', 'A', None)" , "(5, 'D', 'D', 6)" , "(8, 'I', 'I', None)" ,
129- "(None, 'C', 'C', None)" , "(None, 'E', 'E', None)" ,
130- "(None, 'H', 'H', None)" ]
134+ assert [node .key for node in bfs ] == ['F' , 'B' , 'G' , 'A' , 'D' , 'I' , 'C' , 'E' , 'H' ]
135+
131136 assert raises (NotImplementedError , lambda : trav .breadth_first_search (strategy = 'iddfs' ))
132137 assert raises (NotImplementedError , lambda : trav .depth_first_search (order = 'in_out_order' ))
133138 assert raises (TypeError , lambda : BTT (1 ))
@@ -143,32 +148,49 @@ def test_AVLTree():
143148 a .insert ('H' , 'H' )
144149 a .insert ('I' , 'I' )
145150 a .insert ('A' , 'A' )
146- assert str (a ) == ("[(None, 'M', 'M', None), (8, 'N', 'N', 6), "
147- "(None, 'O', 'O', None), (4, 'L', 'L', 0), "
148- "(None, 'K', 'K', None), (None, 'Q', 'Q', None), "
149- "(2, 'P', 'P', 5), (9, 'H', 'H', None), "
150- "(7, 'I', 'I', 3), (None, 'A', 'A', None)]" )
151+
152+ trav = BinaryTreeTraversal (a )
153+ in_order = trav .depth_first_search (order = 'in_order' )
154+ pre_order = trav .depth_first_search (order = 'pre_order' )
155+ assert [node .key for node in in_order ] == ['A' , 'H' , 'I' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' ]
156+ assert [node .key for node in pre_order ] == ['N' , 'I' , 'H' , 'A' , 'L' , 'K' , 'M' , 'P' , 'O' , 'Q' ]
157+
151158 assert [a .balance_factor (n ) for n in a .tree if n is not None ] == \
152159 [0 , - 1 , 0 , 0 , 0 , 0 , 0 , - 1 , 0 , 0 ]
153160 a1 = AVLTree (1 , 1 )
154161 a1 .insert (2 , 2 )
155162 a1 .insert (3 , 3 )
156163 a1 .insert (4 , 4 )
157164 a1 .insert (5 , 5 )
158- assert str (a1 ) == ("[(None, 1, 1, None), (0, 2, 2, 3), (None, 3, 3, None), "
159- "(2, 4, 4, 4), (None, 5, 5, None)]" )
165+
166+ trav = BinaryTreeTraversal (a1 )
167+ in_order = trav .depth_first_search (order = 'in_order' )
168+ pre_order = trav .depth_first_search (order = 'pre_order' )
169+ assert [node .key for node in in_order ] == [1 , 2 , 3 , 4 , 5 ]
170+ assert [node .key for node in pre_order ] == [2 , 1 , 4 , 3 , 5 ]
171+
160172 a3 = AVLTree (- 1 , 1 )
161173 a3 .insert (- 2 , 2 )
162174 a3 .insert (- 3 , 3 )
163175 a3 .insert (- 4 , 4 )
164176 a3 .insert (- 5 , 5 )
165- assert str (a3 ) == ("[(None, -1, 1, None), (3, -2, 2, 0), "
166- "(None, -3, 3, None), (4, -4, 4, 2), "
167- "(None, -5, 5, None)]" )
177+
178+ trav = BinaryTreeTraversal (a3 )
179+ in_order = trav .depth_first_search (order = 'in_order' )
180+ pre_order = trav .depth_first_search (order = 'pre_order' )
181+ assert [node .key for node in in_order ] == [- 5 , - 4 , - 3 , - 2 , - 1 ]
182+ assert [node .key for node in pre_order ] == [- 2 , - 4 , - 5 , - 3 , - 1 ]
183+
168184 a2 = AVLTree ()
169185 a2 .insert (1 , 1 )
170186 a2 .insert (1 , 1 )
171- assert str (a2 ) == "[(None, 1, 1, None)]"
187+
188+ trav = BinaryTreeTraversal (a2 )
189+ in_order = trav .depth_first_search (order = 'in_order' )
190+ pre_order = trav .depth_first_search (order = 'pre_order' )
191+ assert [node .key for node in in_order ] == [1 ]
192+ assert [node .key for node in pre_order ] == [1 ]
193+
172194 a3 = AVLTree ()
173195 a3 .tree = ArrayForTrees (TreeNode , 0 )
174196 for i in range (7 ):
@@ -180,9 +202,13 @@ def test_AVLTree():
180202 a3 .tree [2 ].left = 3
181203 a3 .tree [2 ].right = 4
182204 a3 ._left_right_rotate (0 , 1 )
183- assert str (a3 ) == ("[(4, 0, 0, 6), (5, 1, 1, 3), (1, 2, 2, 0), "
184- "(None, 3, 3, None), (None, 4, 4, None), "
185- "(None, 5, 5, None), (None, 6, 6, None)]" )
205+
206+ trav = BinaryTreeTraversal (a3 )
207+ in_order = trav .depth_first_search (order = 'in_order' )
208+ pre_order = trav .depth_first_search (order = 'pre_order' )
209+ assert [node .key for node in in_order ] == [5 , 1 , 3 , 2 , 4 , 0 , 6 ]
210+ assert [node .key for node in pre_order ] == [2 , 1 , 5 , 3 , 0 , 4 , 6 ]
211+
186212 a4 = AVLTree ()
187213 a4 .tree = ArrayForTrees (TreeNode , 0 )
188214 for i in range (7 ):
@@ -194,9 +220,12 @@ def test_AVLTree():
194220 a4 .tree [3 ].left = 5
195221 a4 .tree [3 ].right = 6
196222 a4 ._right_left_rotate (0 , 2 )
197- assert str (a4 ) == ("[(1, 0, 0, 5), (None, 1, 1, None), (6, 2, 2, 4), "
198- "(0, 3, 3, 2), (None, 4, 4, None), (None, 5, 5, None), "
199- "(None, 6, 6, None)]" )
223+
224+ trav = BinaryTreeTraversal (a4 )
225+ in_order = trav .depth_first_search (order = 'in_order' )
226+ pre_order = trav .depth_first_search (order = 'pre_order' )
227+ assert [node .key for node in in_order ] == [1 , 0 , 5 , 3 , 6 , 2 , 4 ]
228+ assert [node .key for node in pre_order ] == [3 ,0 ,1 ,5 ,2 ,6 ,4 ]
200229
201230 a5 = AVLTree (is_order_statistic = True )
202231 a5 .tree = ArrayForTrees (TreeNode , [
@@ -280,11 +309,13 @@ def test_select_rank(expected_output):
280309 a5 .delete (9 )
281310 a5 .delete (13 )
282311 a5 .delete (20 )
283- assert str (a5 ) == ("[(7, 10, 10, 5), (None, 5, 5, None), "
284- "(0, 17, 17, 6), (None, 2, 2, None), '', "
285- "(8, 12, 12, 9), (10, 30, 30, 13), (3, 3, 3, 1), "
286- "(None, 11, 11, None), (None, 15, 15, None), "
287- "(None, 18, 18, None), '', '', (None, 33, 33, None)]" )
312+
313+ trav = BinaryTreeTraversal (a5 )
314+ in_order = trav .depth_first_search (order = 'in_order' )
315+ pre_order = trav .depth_first_search (order = 'pre_order' )
316+ assert [node .key for node in in_order ] == [2 , 3 , 5 , 10 , 11 , 12 , 15 , 17 , 18 , 30 , 33 ]
317+ assert [node .key for node in pre_order ] == [17 , 10 , 3 , 2 , 5 , 12 , 11 , 15 , 30 , 18 , 33 ]
318+
288319 test_select_rank ([2 , 3 , 5 , 10 , 11 , 12 , 15 , 17 , 18 , 30 , 33 ])
289320 a5 .delete (10 )
290321 a5 .delete (17 )
@@ -333,20 +364,27 @@ def test_CartesianTree():
333364 tree .insert (6 , 42 , 6 )
334365 tree .insert (8 , 49 , 8 )
335366 tree .insert (2 , 99 , 2 )
367+ # Explicit check for the redefined __str__ method of Cartesian Trees Class
336368 assert str (tree ) == \
337369 ("[(1, 3, 1, 3, 3), (2, 1, 6, 1, 9), "
338370 "(None, 0, 9, 0, None), (4, 5, 11, 5, 5), "
339371 "(None, 4, 14, 4, None), (6, 9, 17, 9, None), "
340372 "(7, 7, 22, 7, 8), (None, 6, 42, 6, None), "
341373 "(None, 8, 49, 8, None), (None, 2, 99, 2, None)]" )
374+
375+ trav = BinaryTreeTraversal (tree )
376+ in_order = trav .depth_first_search (order = 'in_order' )
377+ pre_order = trav .depth_first_search (order = 'pre_order' )
378+ assert [node .key for node in in_order ] == [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
379+ assert [node .key for node in pre_order ] == [3 , 1 , 0 , 2 , 5 , 4 , 9 , 7 , 6 , 8 ]
380+
342381 tree .insert (1.5 , 4 , 1.5 )
343- assert str (tree ) == \
344- ("[(10, 3, 1, 3, 3), (2, 1, 6, 1, None), "
345- "(None, 0, 9, 0, None), (4, 5, 11, 5, 5), "
346- "(None, 4, 14, 4, None), (6, 9, 17, 9, None), "
347- "(7, 7, 22, 7, 8), (None, 6, 42, 6, None), "
348- "(None, 8, 49, 8, None), (None, 2, 99, 2, None), "
349- "(1, 1.5, 4, 1.5, 9)]" )
382+
383+ in_order = trav .depth_first_search (order = 'in_order' )
384+ pre_order = trav .depth_first_search (order = 'pre_order' )
385+ assert [node .key for node in in_order ] == [0 , 1 , 1.5 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
386+ assert [node .key for node in pre_order ] == [3 , 1.5 , 1 , 0 , 2 , 5 , 4 , 9 , 7 , 6 , 8 ]
387+
350388 k = tree .search (1.5 )
351389 assert tree .tree [tree .tree [k ].parent ].key == 3
352390 tree .delete (1.5 )
@@ -391,10 +429,13 @@ def test_issue_234():
391429 assert tree .tree [3 ].parent == 5
392430 assert tree .tree [2 ].right != 3
393431 assert tree .tree [tree .tree [5 ].parent ].right == 5
394- assert str (tree ) == ("[(2, 5, 5, 1), (None, 5.5, 5.5, None), "
395- "(4, 4.5, 4.5, 5), (None, 4.6, 4.6, 6), "
396- "(None, 4.4, 4.4, None), (None, 4.55, 4.55, 3), "
397- "(None, 4.65, 4.65, None)]" )
432+
433+ trav = BinaryTreeTraversal (tree )
434+ in_order = trav .depth_first_search (order = 'in_order' )
435+ pre_order = trav .depth_first_search (order = 'pre_order' )
436+ assert [node .key for node in in_order ] == [4.4 , 4.5 , 4.55 , 4.6 , 4.65 , 5 , 5.5 ]
437+ assert [node .key for node in pre_order ] == [5 , 4.5 , 4.4 , 4.55 , 4.6 , 4.65 , 5.5 ]
438+
398439 assert tree .tree [tree .tree [3 ].parent ].right == 3
399440 tree ._left_rotate (5 , 3 )
400441 assert str (tree ) == original_tree
@@ -412,30 +453,56 @@ def test_SplayTree():
412453 t .insert (20 , 20 )
413454 t .insert (55 , 55 )
414455
415- assert str (t ) == ("[(None, 100, 100, None), (None, 50, 50, None), "
416- "(0, 200, 200, None), (None, 40, 40, 1), (5, 30, 30, 3), "
417- "(None, 20, 20, None), (4, 55, 55, 2)]" )
456+ trav = BinaryTreeTraversal (t )
457+ in_order = trav .depth_first_search (order = 'in_order' )
458+ pre_order = trav .depth_first_search (order = 'pre_order' )
459+ assert [node .key for node in in_order ] == [20 , 30 , 40 , 50 , 55 , 100 , 200 ]
460+ assert [node .key for node in pre_order ] == [55 , 30 , 20 , 40 , 50 , 200 , 100 ]
461+
418462 t .delete (40 )
419- assert str (t ) == ("[(None, 100, 100, None), '', (0, 200, 200, None), "
420- "(4, 50, 50, 6), (5, 30, 30, None), (None, 20, 20, None), "
421- "(None, 55, 55, 2)]" )
463+
464+ in_order = trav .depth_first_search (order = 'in_order' )
465+ pre_order = trav .depth_first_search (order = 'pre_order' )
466+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 ]
467+ assert [node .key for node in pre_order ] == [50 , 30 , 20 , 55 , 200 , 100 ]
468+
422469 t .delete (150 )
423- assert str (t ) == ("[(None, 100, 100, None), '', (0, 200, 200, None), (4, 50, 50, 6), "
424- "(5, 30, 30, None), (None, 20, 20, None), (None, 55, 55, 2)]" )
470+
471+ in_order = trav .depth_first_search (order = 'in_order' )
472+ pre_order = trav .depth_first_search (order = 'pre_order' )
473+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 ]
474+ assert [node .key for node in pre_order ] == [50 , 30 , 20 , 55 , 200 , 100 ]
425475
426476 t1 = SplayTree (1000 , 1000 )
427477 t1 .insert (2000 , 2000 )
428- assert str (t1 ) == ("[(None, 1000, 1000, None), (0, 2000, 2000, None)]" )
478+
479+ trav = BinaryTreeTraversal (t1 )
480+ in_order = trav .depth_first_search (order = 'in_order' )
481+ pre_order = trav .depth_first_search (order = 'pre_order' )
482+ assert [node .key for node in in_order ] == [1000 , 2000 ]
483+ assert [node .key for node in pre_order ] == [2000 , 1000 ]
429484
430485 t .join (t1 )
431- assert str (t ) == ("[(None, 100, 100, None), '', (6, 200, 200, 8), (4, 50, 50, None), "
432- "(5, 30, 30, None), (None, 20, 20, None), (3, 55, 55, 0), (None, 1000, 1000, None), "
433- "(7, 2000, 2000, None), '']" )
486+
487+ trav = BinaryTreeTraversal (t )
488+ in_order = trav .depth_first_search (order = 'in_order' )
489+ pre_order = trav .depth_first_search (order = 'pre_order' )
490+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 , 1000 , 2000 ]
491+ assert [node .key for node in pre_order ] == [200 , 55 , 50 , 30 , 20 , 100 , 2000 , 1000 ]
434492
435493 s = t .split (200 )
436- assert str (s ) == ("[(1, 2000, 2000, None), (None, 1000, 1000, None)]" )
437- assert str (t ) == ("[(None, 100, 100, None), '', (6, 200, 200, None), (4, 50, 50, None), "
438- "(5, 30, 30, None), (None, 20, 20, None), (3, 55, 55, 0), '', '', '']" )
494+
495+ trav = BinaryTreeTraversal (s )
496+ in_order = trav .depth_first_search (order = 'in_order' )
497+ pre_order = trav .depth_first_search (order = 'pre_order' )
498+ assert [node .key for node in in_order ] == [1000 , 2000 ]
499+ assert [node .key for node in pre_order ] == [2000 , 1000 ]
500+
501+ trav = BinaryTreeTraversal (t )
502+ in_order = trav .depth_first_search (order = 'in_order' )
503+ pre_order = trav .depth_first_search (order = 'pre_order' )
504+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 ]
505+ assert [node .key for node in pre_order ] == [200 , 55 , 50 , 30 , 20 , 100 ]
439506
440507def test_RedBlackTree ():
441508 tree = RedBlackTree ()
0 commit comments