Można to rozwiązać w lepszy sposób. Możemy również zmniejszyć złożoność czasu do O (n), wprowadzając niewielką modyfikację struktury danych i stosując podejście iteracyjne. Dla szczegółowej analizy i wielu sposobów rozwiązania tego problemu z różnymi strukturami danych.
Oto podsumowanie tego, co chcę wyjaśnić w moim blogu :
Podejście rekurencyjne - średnica drzewa
Inny sposób podejścia do tego problemu jest następujący. Jak wspomniano powyżej, średnica może
- całkowicie leżeć w lewym sub-drzewie lub
- całkowicie leżeć w prawym sub-drzewie lub
- może obejmować cały katalog główny
Co oznacza, że średnicę można idealnie wyprowadzić
- średnica lewego drzewa lub
- średnica prawego drzewa lub
- wysokość lewego drzewa podrzędnego + wysokość prawego drzewa podrzędnego + 1 (1, aby dodać węzeł główny, gdy średnica obejmuje cały węzeł główny)
Wiemy, że średnica jest najdłuższą ścieżką, dlatego bierzemy maksymalnie 1 i 2 w przypadku, gdy leży ona z boku lub weźmy 3, jeśli obejmuje ona rdzeń.
Podejście iteracyjne - średnica drzewa
Mamy drzewo, potrzebujemy meta informacji z każdym węzłem, aby każdy węzeł wiedział, co następuje:
- Wysokość jego lewego dziecka,
- Wysokość jego prawego dziecka i
- Największa odległość między węzłami liści.
Gdy każdy węzeł uzyska te informacje, potrzebujemy zmiennej tymczasowej, aby śledzić maksymalną ścieżkę. Do czasu zakończenia algorytmu mamy wartość średnicy w zmiennej temp.
Teraz musimy rozwiązać ten problem w podejściu oddolnym, ponieważ nie mamy pojęcia o trzech wartościach dla katalogu głównego. Ale znamy te wartości dla liści.
Kroki do rozwiązania
- Zainicjuj wszystkie liście za pomocą leftHeight i rightHeight jako 1.
- Zainicjuj wszystkie liście z maxDistance jako 0, sprawimy, że jeśli jeden z leftHeight lub rightHeight wynosi 1, robimy maxDistance = 0
- Poruszaj się w górę pojedynczo i oblicz wartości dla najbliższego rodzica. To byłoby łatwe, ponieważ teraz znamy te wartości dla dzieci.
W danym węźle
- przypisz leftHeight jako maksymalnie (leftHeight lub rightHeight jego lewego dziecka).
- przypisz rightHeight jako maksimum (leftHeight lub rightHeight jego prawego dziecka).
- jeśli którakolwiek z tych wartości (leftHeight lub rightHeight) wynosi 1, ustaw maxDistance na zero.
- jeśli obie wartości są większe od zera, ustaw maxDistance jako leftHeight + rightHeight - 1
- Zachowaj wartość maxDistance w zmiennej temp. Jeśli w kroku 4 wartość maxDistance jest większa niż bieżąca wartość zmiennej, zastąp ją nową wartością maxDistance.
- Na końcu algorytmu wartością w maxDistance jest średnica.