Це можна вирішити кращим чином. Крім того, ми можемо зменшити часову складність до O (n) з невеликою модифікацією структури даних та використанням ітеративного підходу. Для детального аналізу та кількох способів вирішення цієї проблеми за допомогою різних структур даних.
Ось короткий опис того, що я хочу пояснити у своєму блозі :
Рекурсивний підхід - діаметр дерева
Інший спосіб підходу до цієї проблеми полягає в наступному. Як ми вже згадували вище, діаметр може
- повністю лежати в лівому під дереві або
- повністю лежать у правому під дереві або
- може пролізти через корінь
Що означає, що діаметр в ідеалі може бути отриманий
- діаметр лівого дерева або
- діаметр правого дерева або
- висота лівого піддерева + висота правого піддерева + 1 (1 для додавання кореневого вузла, коли діаметр охоплює кореневий вузол)
І ми знаємо, що діаметр - це найдовший шлях, тому ми беремо максимум 1 і 2 у випадку, якщо він лежить в будь-якій з сторін або в 3, якщо він проходить через корінь.
Ітеративний підхід - діаметр дерева
У нас є дерево, нам потрібна метаінформація з кожним із вузлів, щоб кожен вузол знав наступне:
- Зріст лівої дитини,
- Зріст правильної дитини і
- Найдальша відстань між її листовими вузлами.
Після того, як кожен вузол має цю інформацію, нам потрібна тимчасова змінна для відстеження максимального шляху. На той час, коли алгоритм закінчується, ми маємо значення діаметра в змінній temp.
Тепер нам потрібно вирішити цю проблему підходом знизу вгору, оскільки ми не маємо уявлення про три значення для кореня. Але ми знаємо ці значення для листя.
Кроки до вирішення
- Ініціалізуйте всі листя лівою висотою та правою висотою як 1.
- Ініціалізуйте всі листя з maxDistance як 0, зробимо так, що якщо будь-який з leftHeight або rightHeight дорівнює 1, ми робимо maxDistance = 0
- Рухайтеся по черзі вгору і обчислюйте значення для безпосереднього батьків. Це було б легко, тому що зараз ми знаємо ці цінності для дітей.
У заданому вузлі
- присвоїти leftHeight як максимум (leftHeight або rightHeight лівої дитини).
- призначте правуВисоту як максимум (ліваВісота або ПраваВисота правої дитини).
- якщо будь-яке з цих значень (leftHeight або rightHeight) дорівнює 1, зробіть maxDistance як нуль.
- якщо обидва значення більше нуля, зробіть maxDistance як leftHeight + rightHeight - 1
- Підтримуйте maxDistance у змінній temp, і якщо на кроці 4 maxDistance більше, ніж поточне значення змінної, замініть її на нове значення maxDistance.
- В кінці алгоритму значення в maxDistance є діаметром.