from tree import TreeNode from bfs import bfs sample_root_node = TreeNode("Home") docs = TreeNode("Documents") photos = TreeNode("Photos") sample_root_node.children = [docs, photos] my_wish = TreeNode("WishList.txt") my_todo = TreeNode("TodoList.txt") my_cat = TreeNode("Fluffy.jpg") my_dog = TreeNode("Spot.jpg") docs.children = [my_wish, my_todo] photos.children = [my_cat, my_dog] print(sample_root_node) # Change the 2nd argument below goal_path = bfs(sample_root_node, "Fluffy.jpg") if goal_path is None: print("No path found") else: print("Path found") for node in goal_path: print(node.value)
class TestTreeNode(unittest.TestCase): def setUp(self): self.root_data = 1 self.root = TreeNode(self.root_data) def test_data_descriptor(self): self.assertEqual(self.root_data, self.root.data) with self.assertRaises(AttributeError): self.root.data = 2 def test_insert_child(self): with self.assertRaises(TypeError): self.root.insert_child(2) with self.assertRaises(TypeError): self.root.insert_child(0, 2) with self.assertRaises(TypeError): self.root.insert_child(TreeNode(2)) self.root.insert_child(0, TreeNode(2)) self.root.insert_child(0, TreeNode(3)) self.root.insert_child(10, TreeNode(10)) self.assertEqual(3, self.root._children[0].data) self.assertEqual(2, self.root._children[1].data) self.assertEqual(10, self.root._children[2].data) def test_add_child(self): with self.assertRaises(TypeError): self.root.add_child(2) for i in range(2, 5): self.root.add_child(TreeNode(i)) for i in range(2, 5): self.assertEqual( i, self.root._children[i-2].data ) def test_children(self): itr = self.root.children() with self.assertRaises(StopIteration): next(itr) data = [2, 3, 4, 5] for i in data: self.root.add_child(TreeNode(i)) itr = self.root.children() first = next(itr) self.assertTrue(issubclass(type(first), TreeNode)) self.assertEquals(data[0], first.data) for i, node in enumerate(itr): self.assertEquals(data[i+1], node.data) def test_getitem(self): with self.assertRaises(IndexError): tmp = self.root[0] data = [2, 3, 4, 5] for i in data: self.root.add_child(TreeNode(i)) first = self.root[0] self.assertTrue(issubclass(type(first), TreeNode)) self.assertEquals(data[0], first.data) for i in range(1, len(data)): self.assertEquals(data[i], self.root[i].data) def test_duplicate(self): node_01 = TreeNode('A', 1) node_02 = TreeNode('X', 2) node_03 = TreeNode('H', 3) node_04 = TreeNode('G', 4) node_05 = TreeNode('E', 5) node_06 = TreeNode('G', 6) node_07 = TreeNode('E', 7) node_08 = TreeNode('H', 8) node_09 = TreeNode('A', 9) node_10 = TreeNode('B', 10) node_11 = TreeNode('C', 11) node_12 = TreeNode('H', 12) node_13 = TreeNode('A', 13) node_14 = TreeNode('C', 14) node_15 = TreeNode('B', 15) node_16 = TreeNode('E', 16) node_17 = TreeNode('E', 17) node_18 = TreeNode('E', 18) node_19 = TreeNode('E', 19) node_20 = TreeNode('A', 20) node_21 = TreeNode('B', 21) node_22 = TreeNode('C', 22) node_23 = TreeNode('A', 23) node_24 = TreeNode('B', 24) node_25 = TreeNode('C', 25) node_26 = TreeNode('D', 26) node_27 = TreeNode('A', 27) node_28 = TreeNode('B', 28) node_29 = TreeNode('C', 29) node_30 = TreeNode('A', 30) node_31 = TreeNode('B', 31) node_32 = TreeNode('C', 32) node_33 = TreeNode('D', 33) node_01.add_child(node_02) node_01.add_child(node_03) node_01.add_child(node_04) node_03.add_child(node_05) node_03.add_child(node_06) node_03.add_child(node_07) node_04.add_child(node_08) node_05.add_child(node_09) node_05.add_child(node_10) node_05.add_child(node_11) node_06.add_child(node_12) node_07.add_child(node_13) node_07.add_child(node_14) node_07.add_child(node_15) node_08.add_child(node_16) node_08.add_child(node_17) node_12.add_child(node_18) node_12.add_child(node_19) node_16.add_child(node_20) node_16.add_child(node_21) node_16.add_child(node_22) node_17.add_child(node_23) node_17.add_child(node_24) node_17.add_child(node_25) node_17.add_child(node_26) node_18.add_child(node_27) node_18.add_child(node_28) node_18.add_child(node_29) node_19.add_child(node_30) node_19.add_child(node_31) node_19.add_child(node_32) node_19.add_child(node_33) root = node_01 # Compare trees by structure and by values by_struct_and_value_group_01 = { # A leafs node_09, node_13, node_20, node_23, node_27, node_30 } by_struct_and_value_group_02 = { # B leafs node_10, node_15, node_21, node_24, node_28, node_31 } by_struct_and_value_group_03 = { # C leafs node_11, node_14, node_22, node_25, node_29, node_32 } by_struct_and_value_group_04 = { # D leafs node_26, node_33 } by_struct_and_value_group_05 = { # height 2 group 1 node_05, node_18, node_16 } by_struct_and_value_group_06 = { # height 2 group 2 node_17, node_19 } by_struct_and_value_group_07 = { # height 3 node_08, node_12 } by_struct_and_value_group_08 = { # height 4 node_04, node_06 } expected_duplicate_groups = [ by_struct_and_value_group_01, by_struct_and_value_group_02, by_struct_and_value_group_03, by_struct_and_value_group_04, by_struct_and_value_group_05, by_struct_and_value_group_06, by_struct_and_value_group_07, by_struct_and_value_group_08, ] print("Expected:") pprint(expected_duplicate_groups) dup_groups = root.duplicates(minheight=1, compare_values=True) print("Actual:") pprint(dup_groups) assert len(dup_groups) == len(expected_duplicate_groups), \ 'Sizes of expected and actual groups are not equal' match = False for exp_set in expected_duplicate_groups: match = False for act_set in dup_groups: if exp_set ^ act_set == set(): match = True break # inner loop assert match, \ "Expected group not found in result set. Expected: {}".format(exp_set)