Давайте посмотрим на дерево примеров:
__A__
/ \
B C
/ \ / \
D E F G
В этом дереве мы идеально сбалансированы, поэтому нам не нужно беспокоиться о том, какое дерево выше в каждом узле (они имеют одинаковую высоту). Поэтому мы просто рассчитаем высоту, используя левые ветви.
Какая высота дерева? Это высота A
.
Какая высота A
? Это один плюс высота B
.
В свою очередь, высота B
равна единице плюс высота D
, а высота D
равна единице плюс высота левой ветви D
, которая равна нулю.
Итак, общая высота 1 + 1 + 1 + 0 = 3
.
Таким образом, алгоритм в этом (упрощенном) случае:
def height (node):
if node is null:
return 0
return 1 + height (node.left)
И , поэтому , поэтому ваша рекурсивная функция высоты должна добавлять по одному на каждом уровне. Если вместо этого вы добавляете 0 (что и делает ваш второй сегмент кода), вы переключаетесь с получения 1 + 1 + 1 + 0 = 3
на получение 0 + 0 + 0 + 0 = 0
.
Если вы измените алгоритм выше, чтобы учесть разные размеры поддеревьев, вы в основном получите свой первый сегмент кода, который отлично работает:
def height (node):
if node is null:
return 0
leftheight = height (node.left)
rightheight = height (node.rigth)
return 1 + max (leftheight, rightheight)