def test_delete_node_remove_node_with_right_child_that_has_a_left_child_and_left_grandchildren(
         self):
     bt = BinaryTree()
     bt.root = Node(4)
     bt.root.left_child = Node(2)
     bt.root.right_child = Node(15)
     bt.root.left_child.left_child = Node(1)
     bt.root.left_child.right_child = Node(3)
     bt.root.right_child.left_child = Node(5)
     bt.root.right_child.right_child = Node(25)
     bt.root.right_child.right_child.left_child = Node(19)
     bt.root.right_child.right_child.left_child.right_child = Node(20)
     bt.root.right_child.right_child.left_child.left_child = Node(18)
     bt.root.right_child.right_child.left_child.left_child.left_child = Node(
         17)
     bt.count = 11
     bt.delete_node(15)
     self.assertEqual(4, bt.root.value)
     self.assertEqual(17, bt.root.right_child.value)
     self.assertEqual(5, bt.root.right_child.left_child.value)
     self.assertEqual(25, bt.root.right_child.right_child.value)
     self.assertEqual(19, bt.root.right_child.right_child.left_child.value)
     self.assertEqual(
         18, bt.root.right_child.right_child.left_child.left_child.value)
     self.assertEqual(
         20, bt.root.right_child.right_child.left_child.right_child.value)
     self.assertEqual(
         None,
         bt.root.right_child.right_child.left_child.left_child.left_child)
     self.assertEqual(2, bt.root.left_child.value)
     self.assertEqual(1, bt.root.left_child.left_child.value)
     self.assertEqual(3, bt.root.left_child.right_child.value)
     self.assertEqual(10, bt.count)
 def test_delete_node_remove_root_only_right_child(self):
     bt = BinaryTree()
     bt.root = Node(4)
     bt.root.right_child = Node(6)
     bt.count = 2
     bt.delete_node(4)
     self.assertEqual(6, bt.root.value)
     self.assertEqual(None, bt.root.left_child)
     self.assertEqual(None, bt.root.right_child)
     self.assertEqual(1, bt.count)
 def test_delete_node_remove_root_right_and_left_child(self):
     bt = BinaryTree()
     bt.root = Node(4)
     bt.root.left_child = Node(2)
     bt.root.right_child = Node(6)
     bt.root.right_child.right_child = Node(8)
     bt.count = 4
     bt.delete_node(4)
     self.assertEqual(6, bt.root.value)
     self.assertEqual(2, bt.root.left_child.value)
     self.assertEqual(8, bt.root.right_child.value)
     self.assertEqual(None, bt.root.right_child.right_child)
     self.assertEqual(3, bt.count)
 def test_delete_node_remove_node_with_left_child_but_no_right_child_left_side(
         self):
     bt = BinaryTree()
     bt.root = Node(14)
     bt.root.left_child = Node(10)
     bt.root.right_child = Node(20)
     bt.root.left_child.left_child = Node(9)
     bt.root.left_child.right_child = Node(12)
     bt.root.left_child.left_child.left_child = Node(7)
     bt.count = 6
     bt.delete_node(9)
     self.assertEqual(14, bt.root.value)
     self.assertEqual(10, bt.root.left_child.value)
     self.assertEqual(12, bt.root.left_child.right_child.value)
     self.assertEqual(7, bt.root.left_child.left_child.value)
     self.assertEqual(20, bt.root.right_child.value)
     self.assertEqual(5, bt.count)
 def test_delete_node_remove_right_leaf_node(self):
     bt = BinaryTree()
     bt.root = Node(4)
     bt.root.left_child = Node(2)
     bt.root.right_child = Node(8)
     bt.root.left_child.left_child = Node(1)
     bt.root.left_child.right_child = Node(3)
     bt.root.right_child.left_child = Node(6)
     bt.root.right_child.right_child = Node(9)
     bt.count = 7
     bt.delete_node(9)
     self.assertEqual(4, bt.root.value)
     self.assertEqual(8, bt.root.right_child.value)
     self.assertEqual(6, bt.root.right_child.left_child.value)
     self.assertEqual(None, bt.root.right_child.right_child)
     self.assertEqual(2, bt.root.left_child.value)
     self.assertEqual(1, bt.root.left_child.left_child.value)
     self.assertEqual(3, bt.root.left_child.right_child.value)
     self.assertEqual(6, bt.count)
 def test_delete_node_remove_root_right_and_left_child_with_grandchildren(
         self):
     bt = BinaryTree()
     bt.root = Node(4)
     bt.root.left_child = Node(2)
     bt.root.right_child = Node(6)
     bt.root.left_child.left_child = Node(1)
     bt.root.left_child.right_child = Node(3)
     bt.root.right_child.left_child = Node(5)
     bt.root.right_child.right_child = Node(8)
     bt.root.right_child.right_child.left_child = Node(7)
     bt.count = 8
     bt.delete_node(4)
     self.assertEqual(5, bt.root.value)
     self.assertEqual(6, bt.root.right_child.value)
     self.assertEqual(None, bt.root.right_child.left_child)
     self.assertEqual(2, bt.root.left_child.value)
     self.assertEqual(8, bt.root.right_child.right_child.value)
     self.assertEqual(7, bt.root.right_child.right_child.left_child.value)
     self.assertEqual(7, bt.count)
 def test_delete_node_remove_node_with_right_child_that_has_no_left_child(
         self):
     bt = BinaryTree()
     bt.root = Node(4)
     bt.root.left_child = Node(2)
     bt.root.right_child = Node(6)
     bt.root.left_child.left_child = Node(1)
     bt.root.left_child.right_child = Node(3)
     bt.root.right_child.left_child = Node(5)
     bt.root.right_child.right_child = Node(7)
     bt.root.right_child.right_child.right_child = Node(8)
     bt.count = 8
     bt.delete_node(6)
     self.assertEqual(4, bt.root.value)
     self.assertEqual(7, bt.root.right_child.value)
     self.assertEqual(5, bt.root.right_child.left_child.value)
     self.assertEqual(8, bt.root.right_child.right_child.value)
     self.assertEqual(2, bt.root.left_child.value)
     self.assertEqual(1, bt.root.left_child.left_child.value)
     self.assertEqual(3, bt.root.left_child.right_child.value)
     self.assertEqual(7, bt.count)