Это может быть решено в лучшую сторону. Кроме того, мы можем уменьшить временную сложность до O (n) с небольшим изменением структуры данных и используя итеративный подход. Для подробного анализа и нескольких способов решения этой проблемы с различными структурами данных.
Вот краткое изложение того, что я хочу объяснить в моем блоге :
Рекурсивный подход - диаметр дерева.
Другой способ решения этой проблемы заключается в следующем. Как мы уже упоминали выше, диаметр может
- полностью лежать в левом поддереве или
- полностью лежать в правом поддереве или
- может распространяться через корень
Это означает, что диаметр может быть идеально получен
- диаметр левого дерева или
- диаметр правильного дерева или
- высота левого поддерева + высота правого поддерева + 1 (1 для добавления корневого узла, когда диаметр проходит через корневой узел)
И мы знаем, что диаметр - это самый длинный путь, поэтому мы берем максимум 1 и 2 на случай, если он лежит на одной из боковых сторон, или на 3, если он проходит через корень.
Итерационный подход - диаметр дерева
У нас есть дерево, нам нужна мета-информация с каждым узлом, чтобы каждый узел знал следующее:
- Высота его левого ребенка,
- Высота его правого ребенка и
- Самое дальнее расстояние между его листовыми узлами.
Как только у каждого узла есть эта информация, нам нужна временная переменная для отслеживания максимального пути. Ко времени завершения алгоритма у нас есть значение диаметра в переменной temp.
Теперь нам нужно решить эту проблему восходящим подходом, потому что мы понятия не имеем о трех значениях для корня. Но мы знаем эти значения для листьев.
Шаги для решения
- Инициализируйте все листья с leftHeight и rightHeight как 1.
- Инициализируем все листья с maxDistance как 0, мы отмечаем, что если значение leftHeight или rightHeight равно 1, то maxDistance = 0
- Двигайтесь вверх по одному за раз и вычислите значения для ближайшего родителя. Это было бы легко, потому что теперь мы знаем эти ценности для детей.
В данном узле
- присвойте leftHeight максимальное значение (leftHeight или rightHeight его левого дочернего элемента).
- присвойте rightHeight максимальное значение (leftHeight или rightHeight его правого потомка).
- если любое из этих значений (leftHeight или rightHeight) равно 1, то maxDistance будет равно нулю.
- если оба значения больше нуля, присвойте maxDistance значение leftHeight + rightHeight - 1
- Сохраните значение maxDistance в переменной temp, и если на шаге 4 значение maxDistance больше текущего значения переменной, замените его новым значением maxDistance.
- В конце алгоритма значением в maxDistance является диаметр.