finne den minste dybde bladnode i bst

stemmer
1

Trenger du å få bladnoden som har minimum dybde. Jeg kan ikke tenke på en god måte å gjøre det uten å lagre tilleggsinformasjon i hver node, kan du foreslå, takket veldig mye.

Publisert på 04/11/2011 klokken 00:03
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Brute force løsningen er et bredde-først-søk ender ved det første bladet funnet, vil dette være enklere å implementere iterativt enn rekursivt.

Se for eksempel pseudo-kode i mitt svar på "bredde Først Vs Dybde First" bare legge til en annen tilstand til while-loop.

BTW - Dette vil få deg en blad med minimumsdybden, da det kan være mer enn en på den dybden. Å få et komplett sett med minimumsdybde bladene er litt vanskeligere. Jeg antar gå med en iterativ dypere strategi .


Finne ut hvilket nivå den noden er en.

Tre valg:

Finn noden først og søke ned treet for det. Det høres wasteful, men at andre søke krever besøker bare så mange noder som nivået, så det er fort.

Alternativt kan du holde oversikt når du går. Du bruker tre tellere levelCounter, thisLevelCounterog nextLevelCounter. Hver gang du mer til en ny node du minske thisLevelCounter, og når den treffer null du har flyttet ned et nivå så gjør

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

Hver gang du legger til et barn node til søkelisten, øke nextLevelCounter. Hver gang du lagrer en ny barnenode tilvekstnextLevelCounter

Til slutt gir iterativ dypere strategi deg suksess nivået for gratis (som iterasjon finner det ...) og har samme rekkefølge av ytelse (selv om en litt høyere multiplikator) som bredde-først-søk.

Svarte 04/11/2011 kl. 00:06
kilden bruker

stemmer
0

Her kodeversjon (håper jeg ikke går glipp av noen feil sjekk):

void min_leaf(node_t *t, int *min, int lev, node_t **n) {
    if (!t) {
            return;
    }   

    if (lev > *min) {
            printf("Back from %d at lev %d, min: %d already found\n",
                            t->key,
                            lev,
                            *min);
            return;
    }   

    if (!t->left && !t->right) {
            if (*min > lev) {
                    *min = lev;
                    *n = t;
            }   
    } else {
            min_leaf(t->left, min, lev+1, n); 
            min_leaf(t->right, min, lev+1, n); 
    }   
}

void bst_print_min_leaf(bst_t* bst) {
    int min = 10000; /* Replace it with some really large number */
    node_t *minn = NULL;

    min_leaf(bst->root, &min, 0, &minn); /*level: root is level 0 */
    if (minn) printf("min leaf is at depth: %d: (%p:%d)\n", min, minn, minn->key);
}
Svarte 25/03/2013 kl. 08:31
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more