Tworzę drzewo (zasadniczo drzewo prefiksów, ale dla liczb, a nie ciągów), które składa się z posortowanej listy krotek liczb ((1,1,2), (1,2,5), (2, 1,0) itp.), Z których każdy jest powiązany z jedną wartością skalarną (najprawdopodobniej int lub double). Ponieważ jest on budowany tylko raz, a następnie iterowany nad/przeszukiwany kilka razy, zamierzam użyć std :: vectors do przechowywania dzieci każdego węzła. Aby przeszukać drzewo, wystarczy wywołać std :: lower_bound, aby wykonać przeszukiwanie binarne na wektorze _children każdego węzła, który będzie zawierał std :: pairs każdego węzła i ich odpowiedni klucz. Jednak dolne węzły muszą zawierać wektor z parami składającymi się z ostatniego wpisu w każdej krotce i ich odpowiednich wartości, a zatem muszą być innego typu niż BranchNode. Kod wygląda następująco:C++: Oddzielne klasy dla węzłów gałęzi i liści?
class GenNode
{
};
template<typename key_type,typename value_type>
class BranchNode : GenNode
{
void insert(std::pair< std::vector<key_type> , value_type>);
private:
std::vector< std::pair<key_type,GenNode*> > _children;
};
template<typename key_type,typename value_type>
class LeafNode : GenNode
{
private:
std::vector< std::pair<key_type,value_type> > _children;
};
Jednak jest to naprawdę brzydki, ponieważ obie klasy musi dziedziczyć z klasy GenNode bezużyteczną tak, że dzieci z każdej BranchNode mogą być inne BranchNodes lub LeafNodes ... jest tam lepszy sposób na zrobienie tego?
"Węzeł" to liść do momentu dodania do niego pod-węzłów, a następnie jest gałęzią. Po prostu obiekty 'Node'. –
Nie chcę tego robić ze względu na wydajność; Nie chcę, aby węzły liści miały puste wektory dla dzieci, które nadal przechowują "rozmiar = 0" i inne podobne elementy. –
Istnieje dyskusja na temat zalet różnych implementacji drzewa w sekcji komentarzy tego wpisu na blogu: http : //math.andrej.com/2009/04/11/on-programming-language-design/ – Heatsink