private Drzewo <int> .Wierzcholek <int> SzukajNieskojarzonego(Drzewo <int> .Wierzcholek <int> wierzcholekStartowy, int wZbiorze) { Drzewo <int> .Wierzcholek <int> result = null; foreach (int w in Sasiedzi(wierzcholekStartowy.Wartosc)) { if (wierzcholekStartowy.SciezkaZawieraElement(w) == false) { wierzcholekStartowy.DodajDziecko(w); } } foreach (var d in wierzcholekStartowy.Dzieci) { if (Skojarzenie(d.Wartosc).HasValue == false && NalezyDoZbioru(d.Wartosc, wZbiorze)) { result = d; break; } else { // Szukanie dalej po scieżce naprzemiennej skojarzony-nieskojarzony // Sprawdzanie czy ścieżka jest naprzemienna na podstawie 3 węzłów: wierzcholekStartowy.rodzic, wierzcholekStartowy oraz d // Jeśli rodzic == null wtedy wszystkie d dozwolone if (wierzcholekStartowy.Rodzic == null) { result = SzukajNieskojarzonego(d, wZbiorze); if (result != null) { break; } } else { // Każde d dozwolone jeżeli: startowy skojarzony z: rodzicem lub d if (CzySkojarzone(wierzcholekStartowy.Wartosc, wierzcholekStartowy.Rodzic.Wartosc) || CzySkojarzone(wierzcholekStartowy.Wartosc, d.Wartosc)) { result = SzukajNieskojarzonego(d, wZbiorze); } if (result != null) { break; } } } } return(result); }