2010-03-15 16 views

Odpowiedz

10

Nazywa się średnicę drzewa.

int diameter(Tree * t) // post: return diameter of t 
{ 
    if (t == 0) return 0; 
    int lheight = height(tree->left); 
    int rheight = height(tree->right); 
    int ldiameter = diameter(tree->left); 
    int rdiameter = diameter(tree->right); 
    return max(lheight + rheight + 1, max(ldiameter,rdiameter)); 
} 

alt text http://www.cs.duke.edu/courses/spring00/cps100/assign/trees/diameter.jpg

copied code and images from here.

+1

+1 za dobrĘ ... próbkę algorytmu korzystajĘ ... cego z struktury drzewa. Musisz jednak zapisać wierzchołki, na które masz odległość, oraz najgłębsze wierzchołki dla wysokości. – Li0liQ

+1

@ Li0liQ: Tak, na końcu chcemy nazwy wierzchołków, które są najdalej od siebie. Dodam to ASAP. Dzięki. –

+0

Przepraszam, napisałem, że potrzebowałem węzłów, ale po prostu potrzebowałem dystansu :) dzięki za to świetne wyjaśnienie, nie znałem tej "średnicy" rzeczy, to się przyda, mam nadzieję. – attwad

4

To, czego szukasz, można nazwać graph diameter. Aby go zdobyć, musisz obliczyć ścieżkę od dowolnego wierzchołka do dowolnego innego, a następnie przejść przez wszystkie z nich i znaleźć największy.
Można to osiągnąć za pomocą Dijkstra's algorithm lub po prostu distance matrix (co można osiągnąć, zasilając adjacency matrix), chociaż zajmie to więcej czasu niż algorytm Dijkstry.

+0

+1 za otrzymanie tego pierwszego :) –

1

Ponieważ jest to drzewo, istnieje tylko jedna ścieżka między dowolną parą wierzchołków. Dzięki temu łatwiej nam znaleźć średnicę wykresu.

Najprostszym sposobem na zrobienie tego jest wykonanie dwóch prostych przemieszczeń drzewa. Po pierwsze, weź dowolny dowolny węzeł jako root i oblicz odległość od niego za pomocą prostego systemu plików DFS/BFS. Teraz weź węzeł znajdujący się najdalej od katalogu głównego (ten pierwszy węzeł najbardziej odległej pary), a czyniąc go nowym katalogiem głównym, przeprowadź kolejne przejście odległości obliczeniowych drzewa. Najdalszym węzłem jest drugi węzeł pary.

Dowód na to, że to działa, jest pozostawiony jako ćwiczenie.

Istnieje również inny sposób obliczania najbardziej odległej pary przez obliczanie i porównywanie najdalszych par dla każdego poddrzewa drzewa, zaczynając od dowolnego węzła jako root (wspomnianego już w innej odpowiedzi).

Powiązane problemy