@@ -19,10 +19,13 @@ def test_BinarySearchTree():
1919 b .insert (7 , 7 )
2020 b .insert (14 , 14 )
2121 b .insert (13 , 13 )
22- assert str (b ) == \
23- ("[(1, 8, 8, 2), (3, 3, 3, 4), (None, 10, 10, 7), (None, 1, 1, None), "
24- "(5, 6, 6, 6), (None, 4, 4, None), (None, 7, 7, None), (8, 14, 14, None), "
25- "(None, 13, 13, None)]" )
22+
23+ trav = BinaryTreeTraversal (b )
24+ in_order = trav .depth_first_search (order = 'in_order' )
25+ pre_order = trav .depth_first_search (order = 'pre_order' )
26+ assert [node .key for node in in_order ] == [1 , 3 , 4 , 6 , 7 , 8 , 10 , 13 , 14 ]
27+ assert [node .key for node in pre_order ] == [8 , 3 , 1 , 6 , 4 , 7 , 10 , 14 , 13 ]
28+
2629 assert b .search (10 ) == 2
2730 assert b .search (- 1 ) is None
2831 assert b .delete (13 ) is True
@@ -32,16 +35,25 @@ def test_BinarySearchTree():
3235 assert b .delete (3 ) is True
3336 assert b .search (3 ) is None
3437 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)]" )
38+
39+ in_order = trav .depth_first_search (order = 'in_order' )
40+ pre_order = trav .depth_first_search (order = 'pre_order' )
41+ assert [node .key for node in in_order ] == [1 , 4 , 6 , 7 , 8 , 14 ]
42+ assert [node .key for node in pre_order ] == [8 , 4 , 1 , 6 , 7 , 14 ]
43+
3844 b .delete (7 )
3945 b .delete (6 )
4046 b .delete (1 )
4147 b .delete (4 )
42- assert str (b ) == "[(None, 8, 8, 2), '', (None, 14, 14, None)]"
48+
49+ in_order = trav .depth_first_search (order = 'in_order' )
50+ pre_order = trav .depth_first_search (order = 'pre_order' )
51+ assert [node .key for node in in_order ] == [8 , 14 ]
52+ assert [node .key for node in pre_order ] == [8 , 14 ]
53+
4354 bc = BST (1 , 1 )
4455 assert bc .insert (1 , 2 ) is None
56+
4557 b = BST (- 8 , 8 )
4658 b .insert (- 3 , 3 )
4759 b .insert (- 10 , 10 )
@@ -102,32 +114,20 @@ def test_BinaryTreeTraversal():
102114 b .insert ('H' , 'H' )
103115 trav = BTT (b )
104116 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)" ]
117+ assert [node .key for node in pre ] == ['F' , 'B' , 'A' , 'D' , 'C' , 'E' , 'G' , 'I' , 'H' ]
118+
109119 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)" ]
120+ assert [node .key for node in ino ] == ['A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' ]
121+
114122 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)" ]
123+ assert [node .key for node in out ] == ['I' , 'H' , 'G' , 'F' , 'E' , 'D' , 'C' , 'B' , 'A' ]
124+
119125 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)" ]
126+ assert [node .key for node in post ] == ['A' , 'C' , 'E' , 'D' , 'B' , 'H' , 'I' , 'G' , 'F' ]
127+
125128 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)" ]
129+ assert [node .key for node in bfs ] == ['F' , 'B' , 'G' , 'A' , 'D' , 'I' , 'C' , 'E' , 'H' ]
130+
131131 assert raises (NotImplementedError , lambda : trav .breadth_first_search (strategy = 'iddfs' ))
132132 assert raises (NotImplementedError , lambda : trav .depth_first_search (order = 'in_out_order' ))
133133 assert raises (TypeError , lambda : BTT (1 ))
@@ -143,32 +143,49 @@ def test_AVLTree():
143143 a .insert ('H' , 'H' )
144144 a .insert ('I' , 'I' )
145145 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)]" )
146+
147+ trav = BinaryTreeTraversal (a )
148+ in_order = trav .depth_first_search (order = 'in_order' )
149+ pre_order = trav .depth_first_search (order = 'pre_order' )
150+ assert [node .key for node in in_order ] == ['A' , 'H' , 'I' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' ]
151+ assert [node .key for node in pre_order ] == ['N' , 'I' , 'H' , 'A' , 'L' , 'K' , 'M' , 'P' , 'O' , 'Q' ]
152+
151153 assert [a .balance_factor (n ) for n in a .tree if n is not None ] == \
152154 [0 , - 1 , 0 , 0 , 0 , 0 , 0 , - 1 , 0 , 0 ]
153155 a1 = AVLTree (1 , 1 )
154156 a1 .insert (2 , 2 )
155157 a1 .insert (3 , 3 )
156158 a1 .insert (4 , 4 )
157159 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)]" )
160+
161+ trav = BinaryTreeTraversal (a1 )
162+ in_order = trav .depth_first_search (order = 'in_order' )
163+ pre_order = trav .depth_first_search (order = 'pre_order' )
164+ assert [node .key for node in in_order ] == [1 , 2 , 3 , 4 , 5 ]
165+ assert [node .key for node in pre_order ] == [2 , 1 , 4 , 3 , 5 ]
166+
160167 a3 = AVLTree (- 1 , 1 )
161168 a3 .insert (- 2 , 2 )
162169 a3 .insert (- 3 , 3 )
163170 a3 .insert (- 4 , 4 )
164171 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)]" )
172+
173+ trav = BinaryTreeTraversal (a3 )
174+ in_order = trav .depth_first_search (order = 'in_order' )
175+ pre_order = trav .depth_first_search (order = 'pre_order' )
176+ assert [node .key for node in in_order ] == [- 5 , - 4 , - 3 , - 2 , - 1 ]
177+ assert [node .key for node in pre_order ] == [- 2 , - 4 , - 5 , - 3 , - 1 ]
178+
168179 a2 = AVLTree ()
169180 a2 .insert (1 , 1 )
170181 a2 .insert (1 , 1 )
171- assert str (a2 ) == "[(None, 1, 1, None)]"
182+
183+ trav = BinaryTreeTraversal (a2 )
184+ in_order = trav .depth_first_search (order = 'in_order' )
185+ pre_order = trav .depth_first_search (order = 'pre_order' )
186+ assert [node .key for node in in_order ] == [1 ]
187+ assert [node .key for node in pre_order ] == [1 ]
188+
172189 a3 = AVLTree ()
173190 a3 .tree = ArrayForTrees (TreeNode , 0 )
174191 for i in range (7 ):
@@ -180,9 +197,13 @@ def test_AVLTree():
180197 a3 .tree [2 ].left = 3
181198 a3 .tree [2 ].right = 4
182199 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)]" )
200+
201+ trav = BinaryTreeTraversal (a3 )
202+ in_order = trav .depth_first_search (order = 'in_order' )
203+ pre_order = trav .depth_first_search (order = 'pre_order' )
204+ assert [node .key for node in in_order ] == [5 , 1 , 3 , 2 , 4 , 0 , 6 ]
205+ assert [node .key for node in pre_order ] == [2 , 1 , 5 , 3 , 0 , 4 , 6 ]
206+
186207 a4 = AVLTree ()
187208 a4 .tree = ArrayForTrees (TreeNode , 0 )
188209 for i in range (7 ):
@@ -194,9 +215,12 @@ def test_AVLTree():
194215 a4 .tree [3 ].left = 5
195216 a4 .tree [3 ].right = 6
196217 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)]" )
218+
219+ trav = BinaryTreeTraversal (a4 )
220+ in_order = trav .depth_first_search (order = 'in_order' )
221+ pre_order = trav .depth_first_search (order = 'pre_order' )
222+ assert [node .key for node in in_order ] == [1 , 0 , 5 , 3 , 6 , 2 , 4 ]
223+ assert [node .key for node in pre_order ] == [3 ,0 ,1 ,5 ,2 ,6 ,4 ]
200224
201225 a5 = AVLTree (is_order_statistic = True )
202226 a5 .tree = ArrayForTrees (TreeNode , [
@@ -280,11 +304,13 @@ def test_select_rank(expected_output):
280304 a5 .delete (9 )
281305 a5 .delete (13 )
282306 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)]" )
307+
308+ trav = BinaryTreeTraversal (a5 )
309+ in_order = trav .depth_first_search (order = 'in_order' )
310+ pre_order = trav .depth_first_search (order = 'pre_order' )
311+ assert [node .key for node in in_order ] == [2 , 3 , 5 , 10 , 11 , 12 , 15 , 17 , 18 , 30 , 33 ]
312+ assert [node .key for node in pre_order ] == [17 , 10 , 3 , 2 , 5 , 12 , 11 , 15 , 30 , 18 , 33 ]
313+
288314 test_select_rank ([2 , 3 , 5 , 10 , 11 , 12 , 15 , 17 , 18 , 30 , 33 ])
289315 a5 .delete (10 )
290316 a5 .delete (17 )
@@ -333,20 +359,20 @@ def test_CartesianTree():
333359 tree .insert (6 , 42 , 6 )
334360 tree .insert (8 , 49 , 8 )
335361 tree .insert (2 , 99 , 2 )
336- assert str (tree ) == \
337- ("[(1, 3, 1, 3, 3), (2, 1, 6, 1, 9), "
338- "(None, 0, 9, 0, None), (4, 5, 11, 5, 5), "
339- "(None, 4, 14, 4, None), (6, 9, 17, 9, None), "
340- "(7, 7, 22, 7, 8), (None, 6, 42, 6, None), "
341- "(None, 8, 49, 8, None), (None, 2, 99, 2, None)]" )
362+
363+ trav = BinaryTreeTraversal (tree )
364+ in_order = trav .depth_first_search (order = 'in_order' )
365+ pre_order = trav .depth_first_search (order = 'pre_order' )
366+ assert [node .key for node in in_order ] == [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
367+ assert [node .key for node in pre_order ] == [3 , 1 , 0 , 2 , 5 , 4 , 9 , 7 , 6 , 8 ]
368+
342369 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)]" )
370+
371+ in_order = trav .depth_first_search (order = 'in_order' )
372+ pre_order = trav .depth_first_search (order = 'pre_order' )
373+ assert [node .key for node in in_order ] == [0 , 1 , 1.5 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
374+ assert [node .key for node in pre_order ] == [3 , 1.5 , 1 , 0 , 2 , 5 , 4 , 9 , 7 , 6 , 8 ]
375+
350376 k = tree .search (1.5 )
351377 assert tree .tree [tree .tree [k ].parent ].key == 3
352378 tree .delete (1.5 )
@@ -391,10 +417,13 @@ def test_issue_234():
391417 assert tree .tree [3 ].parent == 5
392418 assert tree .tree [2 ].right != 3
393419 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)]" )
420+
421+ trav = BinaryTreeTraversal (tree )
422+ in_order = trav .depth_first_search (order = 'in_order' )
423+ pre_order = trav .depth_first_search (order = 'pre_order' )
424+ assert [node .key for node in in_order ] == [4.4 , 4.5 , 4.55 , 4.6 , 4.65 , 5 , 5.5 ]
425+ assert [node .key for node in pre_order ] == [5 , 4.5 , 4.4 , 4.55 , 4.6 , 4.65 , 5.5 ]
426+
398427 assert tree .tree [tree .tree [3 ].parent ].right == 3
399428 tree ._left_rotate (5 , 3 )
400429 assert str (tree ) == original_tree
@@ -412,30 +441,56 @@ def test_SplayTree():
412441 t .insert (20 , 20 )
413442 t .insert (55 , 55 )
414443
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)]" )
444+ trav = BinaryTreeTraversal (t )
445+ in_order = trav .depth_first_search (order = 'in_order' )
446+ pre_order = trav .depth_first_search (order = 'pre_order' )
447+ assert [node .key for node in in_order ] == [20 , 30 , 40 , 50 , 55 , 100 , 200 ]
448+ assert [node .key for node in pre_order ] == [55 , 30 , 20 , 40 , 50 , 200 , 100 ]
449+
418450 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)]" )
451+
452+ in_order = trav .depth_first_search (order = 'in_order' )
453+ pre_order = trav .depth_first_search (order = 'pre_order' )
454+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 ]
455+ assert [node .key for node in pre_order ] == [50 , 30 , 20 , 55 , 200 , 100 ]
456+
422457 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)]" )
458+
459+ in_order = trav .depth_first_search (order = 'in_order' )
460+ pre_order = trav .depth_first_search (order = 'pre_order' )
461+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 ]
462+ assert [node .key for node in pre_order ] == [50 , 30 , 20 , 55 , 200 , 100 ]
425463
426464 t1 = SplayTree (1000 , 1000 )
427465 t1 .insert (2000 , 2000 )
428- assert str (t1 ) == ("[(None, 1000, 1000, None), (0, 2000, 2000, None)]" )
466+
467+ trav = BinaryTreeTraversal (t1 )
468+ in_order = trav .depth_first_search (order = 'in_order' )
469+ pre_order = trav .depth_first_search (order = 'pre_order' )
470+ assert [node .key for node in in_order ] == [1000 , 2000 ]
471+ assert [node .key for node in pre_order ] == [2000 , 1000 ]
429472
430473 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), '']" )
474+
475+ trav = BinaryTreeTraversal (t )
476+ in_order = trav .depth_first_search (order = 'in_order' )
477+ pre_order = trav .depth_first_search (order = 'pre_order' )
478+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 , 1000 , 2000 ]
479+ assert [node .key for node in pre_order ] == [200 , 55 , 50 , 30 , 20 , 100 , 2000 , 1000 ]
434480
435481 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), '', '', '']" )
482+
483+ trav = BinaryTreeTraversal (s )
484+ in_order = trav .depth_first_search (order = 'in_order' )
485+ pre_order = trav .depth_first_search (order = 'pre_order' )
486+ assert [node .key for node in in_order ] == [1000 , 2000 ]
487+ assert [node .key for node in pre_order ] == [2000 , 1000 ]
488+
489+ trav = BinaryTreeTraversal (t )
490+ in_order = trav .depth_first_search (order = 'in_order' )
491+ pre_order = trav .depth_first_search (order = 'pre_order' )
492+ assert [node .key for node in in_order ] == [20 , 30 , 50 , 55 , 100 , 200 ]
493+ assert [node .key for node in pre_order ] == [200 , 55 , 50 , 30 , 20 , 100 ]
439494
440495def test_RedBlackTree ():
441496 tree = RedBlackTree ()
0 commit comments