Я практикую некоторые вопросы интервью и пытаюсь выяснить временную сложность моего решения, чтобы определить, сбалансировано ли данное бинарное дерево.
Я считаю, что решение 2 имеет временную сложность O(n)
, а решение 1 имеет временную сложность O(n^2)
. Это связано с тем, что в решении 1 вы возвращаетесь к нижней части дерева, чтобы проверить, сбалансировано ли дерево, а также проверить наличие различий в высоте поддерева. Дополнительная сложность возникает по мере того, как мы поднимаемся вверх по дереву к корню, а get_height все еще рекурсивно спускается вниз по дереву для вычисления высоты. Поэтому, путешествуя по дереву еще раз --> O(n^2)
.
Тот факт, что решение 2 сначала сравнивает высоту, означает, что при движении вверх по дереву нам не нужно возвращаться вниз, чтобы проверить высоту поддерева.
помощник:
def get_height(root):
if root is None:
return 0
else:
return max(get_height(root.left), get_height(root.right)) + 1
Решение 1:
def is_balanced(root):
if root is None:
return True
else:
return is_balanced(root.right) and is_balanced(root.left) and (abs(get_height(root.left) - get_height(root.right)) < 2)
Решение 2:
def is_balanced2(root):
if root is None:
return True
else:
return (abs(get_height(root.left) - get_height(root.right)) < 2) and is_balanced(root.right) and is_balanced(root.left)
код для проверки разницы во времени:
s = time.time()
print("result: {}".format(is_balanced(a)))
print("time: {}".format(time.time() - s))
s = time.time()
print("result: {}".format(is_balanced2(a)))
print("time: {}".format(time.time() - s))
результаты для несбалансированного дерева:
result: False
time: 2.90870666504e-05 # solution 1
result: False
time: 1.50203704834e-05 # solution 2