Skip to content

Commit 42832f7

Browse files
authored
Replaced the tests of Binary Trees that need manual string matching (#304)
1 parent 3f3faad commit 42832f7

File tree

1 file changed

+141
-74
lines changed

1 file changed

+141
-74
lines changed

pydatastructs/trees/tests/test_binary_trees.py

Lines changed: 141 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -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

440507
def test_RedBlackTree():
441508
tree = RedBlackTree()

0 commit comments

Comments
 (0)