Drzewo to taki graf, którego wszystkie wierzchołki są połączone, a pomiędzy dwoma dowolnymi wierzchołkami istnieje dokładnie jedna ścieżka. W takim grafie nie występują cykle. Innymi słowy graf musi być spójny i acykliczny.
Poniższy graf nie może być drzewem, ponieważ zawiera on przykładowo cykl ACFD, a ponadto nie jest spójny. Istnieją dwie oddzielne części grafu: ABCDEF oraz GH.
Z kolei poniższy graf jest drzewem:
Nie można tutaj znaleźć cykli, a wszystkie wierzchołki są połączone w spójną całość. Oznacza to też, że pomiędzy dwoma wierzchołkami istnieje dokładnie jedna i tylko jedna droga.
Jednym ze sposobów na sprawdzenie czy graf jest drzewem polega na wykorzystaniu algorytmu BFS. W tym przypadku należałoby zbierać o każdym kolejnym wierzchołki dwie informacje: poprzednika oraz czy dany wierzchołek został już odwiedzony. Algorytm można rozpocząć w dowolnym wierzchołku - nie wpłynie to w jakikolwiek sposób na wynik. Podczas odwiedzania wierzchołka należy uważnie odwiedzać jego sąsiadów. Otóż jeśli sąsiad do odwiedzenia jest już odwiedzony, ale nie jest to poprzednik to znaczy, że w grafie występuje cykl! Nie będzie to wtedy drzewo. Ponadto na koniec algorytmu należy sprawdzić czy wszystkie wierzchołki zostały odwiedzone, aby potwierdzić też warunek spójności.
Poniższa funkcja czyDrzewo() na podstawie przekazanej macierzy zwraca informację czy podany graf jest drzewem.
Funkcja wykorzystuje algorytm BFS. Początkowo wszystkie wierzchołki nie mają ustalonego poprzednika oraz nie są odwiedzone. Jako punkt początkowy jest wybierany pierwszy wierzchołek. Następnie odwiedzani są wszyscy kolejni sąsiedzi z którymi wierzchołek ma połączenie. Podczas przechodzenia sprawdzane jest czy nie występują cykle. Na koniec sprawdzana jest spójność. Jeśli algorytm nie zostanie przerwany to na koniec można zwrócić prawdę.
Do przetestowania funkcji można skorzystać z poniższego fragmentu kodu:
Graf należy podać w formie macierzy takiej jak poniżej:
Graf ten reprezentuje przykład poprawnego grafu - drzewa na początku artykułu.