Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Algorytm zliczający ilość wystąpień każdego z typów w drzewie

Ostatnio zmodyfikowano 2015-11-02 19:49
Autor Wiadomość
TheReclif
Temat założony przez niniejszego użytkownika
» 2015-11-01 21:18:23
Temat otwieram ponownie, ponieważ nie zauważyłem ,że mój problem nie został rozwiązany. A mianowicie czy można zmodyfikować funkcję
C/C++
unsigned IleWDrzewie( int liczony, const Node * korzen )
{
    if( !korzen )
         return 0;
   
    unsigned wynik = 0;
    wynik += IleWDrzewie( liczony, korzen->left );
    wynik += IleWDrzewie( liczony, korzen->right );
    if( korzen->cos == liczony )
         ++wynik;
   
    return wynik;
}
tak, aby (tak, jak w temacie) zliczyć za jednym razem sumę wystąpień każdego z "cośów"? Nie chcę wywoływać jednej funkcji dla każdego z typów, tylko jeden raz taką ze wskaźnikiem na węzeł i tablicą sum wystąpień typów do wypełnienia przez tą funkcję.
P-139487
notabigthreat
» 2015-11-02 18:01:24
C/C++
//zwraca vector par {cos,ilosc}, gdzie 'cos' to, no wlasnie, cos ("kolor"?),
//a 'ilosc' to ilosc wierzcholkow z takim właśnie cosiem
vector < pair < int, unsigned >> IleWDrzewieWszystkich( const Node * korzen )
{
    vector < pair < int, unsigned >> wynik;
    IleWDrzewieWszystkich2( & wynik, korzen );
    return wynik;
}
//to samo, ale wynik zostaje przekazany przez pierwszy argument
//w ten sposób (może tylko mi) łatwiej zorganizować rekurencję
void IleWDrzewieWszystkich2( vector < pair < int, unsigned >>* miejsce_na_wynik, const Node * korzen )
{
    if( !korzen )
         return 0;
   
    const int cos_korzenia = korzen->cos;
   
    vector < pair < int, unsigned >>::iterator it =
    find_if( miejsce_na_wynik->begin(),
    miejsce_na_wynik->end(),
    [ cos_korzenia ]( const pair < int, unsigned >& p ) { return p.first() == cos_korzenia } );
   
    if( it == miejsce_na_wynik->end() )
    miejsce_na_wynik->push_back( { cos_korzenia, 1 } );
    else ++( it->second() );
   
    IleWDrzewieWszystkich2( miejsce_na_wynik, korzen->left );
    IleWDrzewieWszystkich2( miejsce_na_wynik, korzen->right );
}
P-139526
1aam2am1
» 2015-11-02 19:49:38
1. Jeżeli prawy różny od NULL obiektzliczen = prawy; licznik++; Idź do punktu 1.
2. Jeżeli lewy różny od NULL obiektzliczen = lewy; licznik++; Idź do punktu 1.
3. Ze spadaniem z hierarchii jest inaczej.Jeżeli spadamy z prawej odnogi sprawdzamy czy lewa jest różna od NULL jak w punkcje nr. 2. Natomiast jeżli spadamy z lewej odnogi powtarzamy całą czynność spadania aż spadniemy do korzeń = NULL lub gdy osiągniemy spadanie z prawej odnogi.

Lepiej nie umiem opisać pożądanego algorytmu.
P-139534
1 « 2 »
Poprzednia strona Strona 2 z 2