Trie - liść, a koniec wyrazu

0

Witam wszystkich!
Mam problem przy pisaniu drzewa trie. Mianowicie, liście w takim drzewie są oznaczane inaczej niż węzły i zasadniczo znaczą koniec słowa. Co jednak się dzieje, jeśli zanim dotrę do liścia, znajdę inne słowo? Np. oko -> okolica. W tyn przypadku 'a' będzie liściem, kiedy drugie 'o' również takim liściem być powinno. Po co rozróżnia się liście i węzły i czy jest takie rozróżnienie potrzebne?

Z góry dziękuję za odpowiedź i pozdrawiam:
NieJa

0

Drzewo jest to rodzaj grafu (skierowany, spójny). Słowo znalezione w drzewie jest podgrafem. Jeżeli chodzi o liść, to jest to węzeł bez potomków więc węzeł 'o' nie pasuje do tej definicji w grafie "głównym". Nie napiszę więcej bo nie wiem co dokładnie tworzysz :P

1

Podpinaj do węzłów które mogą kończyć wyraz dodatkowy węzeł oznaczający koniec wyrazu po prostu.
W związku z czym mają OKO-> będziesz miał od niego dwa węzły, jeden to "terminator" drugi to L (dla OKOLICA) i potem po A na końcu wyrazu znów będzie przejście do węzła terminujacego.

0

A czy nie można zamiast węzła terminującego dać wartości logicznej w każdym węźle, przy czym będzie ona prawdą, jeśli dany węzeł kończy wyraz i fałszem, jeśli jest to węzeł pośredni?
Program, który piszę to projekt na studiach "Rejestr ludzi", przetrzymuje dane osobowe i relacje rodzinne, przy czym głównym identyfikatorem jest PESEL. Ogólnie napisać go potrafię bez problemu, tylko nie wiem jak ważne jest zachowanie standardów :P.

0

Jakiś czas temu skończyłem całe drzewo Trie. Niestety musiałem je później przerobić na PATRICIA ^^ (już się z tym uporałem :P). Tak czy siak, chciałem się podzielić podstawowymi operacjami Trie. Drzewo indeksujące PESEL. Klasy person nie zamieszczałem, można taką stworzyć samemu :P. Język oczywiście C++ :).

class node {
public:
    node* _[_TSIZE];
    person* x;
    node() {
        p = NULL;
        x = NULL;
        for (int i = 0; i < _TSIZE; i++)
            _[i] = NULL;
    }
    ~node() {
        if (x) delete x;
        for (int i = 0; i < _TSIZE; i++)
            if (_[i]) delete _[i];
    }
};

class registry {
private:
    node* root;
    node* getnode(string);
public:
    inline void printall(node*);    
    registry();
    ~registry();
    void add(string, string, string, bool);
    void remove(string);
    person* getperson(string);
};

registry::registry() {
    root = new node();
}

registry::~registry() {
    delete root;
}

node* registry::getnode(string pesel) {
    node* tmp = root;
    for (int i = 0, indx = pesel[i] - 48; pesel[i]!='\0'; indx = pesel[++i] - 48) {
        if (tmp -> _[indx] == NULL)
            return NULL;
        tmp = tmp -> _[indx];
    }
    return tmp;
}

inline void registry::printall(node* start = NULL) {
    if (!start)
        start = root;
    if (start -> x)
        start -> x -> display();
    for (int i = 0; i < _TSIZE ; i++)
        if (start -> _[i])
            printall(start -> _[i]);
}

void registry::add(string pesel, string imie, string nazwisko, bool silent = false) {
    node* tmp = root;
    for (int i = 0, indx = pesel[i] - 48; pesel[i]!='\0'; indx = pesel[++i] - 48) {
        if (tmp -> _[indx] == NULL)
            tmp -> _[indx] = new node();
        tmp = tmp -> _[indx];
    }
    if (tmp -> x) {
        if (!silent)
            cout << _MSG_EXISTS << endl;
    } else {
        tmp -> x = new person(pesel,imie,nazwisko);
        if (!silent)
            cout << _MSG_DONE << endl;
    }
}

void registry::remove(string pesel) {
    node* tmp = getnode(pesel);
    if (!tmp || !tmp -> x)
        cout << _MSG_NOTFOUND << endl;
    else {
        if (tmp -> x -> children -> size() == 0 && tmp -> x -> parent -> size() == 0) {
            delete tmp -> x;
            tmp -> x = NULL;
            cout << _MSG_DONE << endl;
        } else {
            cout << _MSG_DELFAIL << endl;
        }
    }
}

person* registry::getperson(string pesel) {
    node* tmp = getnode(pesel);
    if (!tmp || !tmp -> x) {
        cout << _MSG_NOTFOUND << endl;
        return NULL;
    } else
        return tmp -> x;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1