def test_full_binary_tree():
    #        10
    #    6       14
    #   4 8    12   16
    tree = BSTNode(10)
    connect_bst_nodes(tree, BSTNode(6), BSTNode(14))
    connect_bst_nodes(tree.left, BSTNode(4), BSTNode(8))
    connect_bst_nodes(tree.right, BSTNode(12), BSTNode(16))
    assert tree_is_balanced(tree) == True
    assert tree_is_balanced2(tree) == True
    assert tree_is_balanced3(tree) == True
def test_not_full_but_balance_binary_tree():
    #        10
    #     6       14
    #   4   8         16
    #     7
    tree = BSTNode(10)
    connect_bst_nodes(tree, BSTNode(6), BSTNode(14))
    connect_bst_nodes(tree.left, BSTNode(4), BSTNode(8))
    connect_bst_nodes(tree.right, None, BSTNode(16))
    connect_bst_nodes(tree.left.right, BSTNode(7), None)
    assert tree_is_balanced(tree) == True
    assert tree_is_balanced2(tree) == True
    assert tree_is_balanced3(tree) == True
def test_right_binary_tree():
    #   1
    #      2
    #         3
    #            4
    #               5
    tree = BSTNode(1)
    connect_bst_nodes(tree, None, BSTNode(2))
    connect_bst_nodes(tree.right, None, BSTNode(3))
    connect_bst_nodes(tree.right.right, None, BSTNode(4))
    connect_bst_nodes(tree.right.right.right, None, BSTNode(5))
    assert tree_is_balanced(tree) == False
    assert tree_is_balanced2(tree) == False
    assert tree_is_balanced3(tree) == False
def test_left_binary_tree():
    #            5
    #          4
    #        3
    #      2
    #    1
    tree = BSTNode(5)
    connect_bst_nodes(tree, BSTNode(4), None)
    connect_bst_nodes(tree.left, BSTNode(3), None)
    connect_bst_nodes(tree.left.left, BSTNode(2), None)
    connect_bst_nodes(tree.left.left.left, BSTNode(1), None)
    assert tree_is_balanced(tree) == False
    assert tree_is_balanced2(tree) == False
    assert tree_is_balanced3(tree) == False
def test_not_balanced_binary_tree1():
    #            1
    #         /      \
    #        2        3
    #       /\
    #      4  5
    #        /
    #       6
    tree = BSTNode(1)
    connect_bst_nodes(tree, BSTNode(2), BSTNode(3))
    connect_bst_nodes(tree.left, BSTNode(4), BSTNode(5))
    connect_bst_nodes(tree.left.right, BSTNode(6), None)
    assert tree_is_balanced(tree) == False
    assert tree_is_balanced2(tree) == False
    assert tree_is_balanced3(tree) == False
def test_not_balanced_binary_tree2():
    #            1
    #         /      \
    #        2        2
    #       /          \
    #      3            3
    #     /              \
    #    4                4
    tree = BSTNode(1)
    connect_bst_nodes(tree, BSTNode(2), BSTNode(2))
    connect_bst_nodes(tree.left, BSTNode(3), None)
    connect_bst_nodes(tree.right, None, BSTNode(3))
    connect_bst_nodes(tree.left.left, BSTNode(4), None)
    connect_bst_nodes(tree.right.right, None, BSTNode(4))
    assert tree_is_balanced(tree) == False
    assert tree_is_balanced2(tree) == False
    assert tree_is_balanced3(tree) == False
def test_none():
    tree = None
    assert tree_is_balanced(tree) == True
    assert tree_is_balanced2(tree) == True
    assert tree_is_balanced3(tree) == True
def test_one_node():
    tree = BSTNode(5)
    assert tree_is_balanced(tree) == True
    assert tree_is_balanced2(tree) == True
    assert tree_is_balanced3(tree) == True