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.
finne den minste dybde bladnode i bst
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.
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);
}













