Я работаю над известной проблемой, которая называется Диаметр бинарного дерева.Я знаю, что это обсуждалось много раз ( Диаметр бинарного дерева ) здесь, но объяснение кажется неправильным.В частности, одиночное дерево узлов должно возвращать 0, а не 1 (я проверил из собственной проверки Leetcode).В любом случае, вот формулировка проблемы:
Для заданного бинарного дерева вам нужно вычислить длину диаметра дерева.Диаметр бинарного дерева - это длина самого длинного пути между любыми двумя узлами в дереве.Этот путь может проходить или не проходить через корень.
Ответы 0, 1 и 5 соответственно.С первого взгляда кажется, что вычисляется количество ребер левого поддерева, а число правого поддерева должно дать ответ.
Итак, я начал с рекурсии по порядку (снизу вверх):
max_diameter = 0
def getDiameter(node):
if node is NULL:
return 0
left_diameter = getDiameter(node.left)
right_diameter = getDiameter(node.right)
max_diameter = max(left + right, max_diameter)
Пока все хорошо.Но код не работает, и я изо всех сил пытаюсь понять некоторые из решений там.Например:
class Solution(object):
def diameterOfBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.ans = 0
def depth(p):
if not p: return 0
left, right = depth(p.left), depth(p.right)
self.ans = max(self.ans, left+right)
return 1 + max(left, right)
depth(root)
return self.ans
Зачем сравнивать левое поддерево и правое поддерево?Почему +1?Кроме того, некоторые говорят, что найти высоту, некоторые говорят, найти глубину.Это сбивает с толку, и я чувствую, что люди просто выкидывают термины ... Любое разъяснение полезно.