ON solution return 0 if unbalanced else depth  1 def isbalancedroot:  ON2 solution  left  maxheightroot.left right  maxheightroot.right return absleftright  1 and isbalancedroot.left and isbalancedroot.right def maxheightroot: if root is None: return 0 return maxmaxheightroot.left, maxheightroot.right  1
def is_balanced(root):
    return __is_balanced_recursive(root)


def __is_balanced_recursive(root):
    """
    O(N) solution
    """
    return -1 != __get_depth(root)


def __get_depth(root):
    """
    return 0 if unbalanced else depth + 1
    """
    if root is None:
        return 0
    left = __get_depth(root.left)
    right = __get_depth(root.right)
    if abs(left-right) > 1 or -1 in [left, right]:
        return -1
    return 1 + max(left, right)


# def is_balanced(root):
#     """
#     O(N^2) solution
#     """
#     left = max_height(root.left)
#     right = max_height(root.right)
#     return abs(left-right) <= 1 and is_balanced(root.left) and
#     is_balanced(root.right)

# def max_height(root):
#     if root is None:
#         return 0
#     return max(max_height(root.left), max_height(root.right)) + 1
