Kell, hogy a levél csomópont, amely minimális mélysége. Nem tudok egy jó módja annak, hogy csinálni anélkül, további információk, az egyes csomópontok, kérjük azt sugallják, köszönöm szépen.
megtalálni a legkisebb mélység levél csomópont BST
A brute force megoldás egy szélességi keresést végződő első levél találtam, ez könnyebb lesz végrehajtani iteratív mint rekurzív.
Lásd például az ál-kódot a válaszom „szélességi bejárás Vs Mélység” Először csak egy újabb feltételt a while-loop.
BTW - Ez lesz a levél a minimális mélység, mert előfordulhat, hogy egynél több ilyen mélységben. Ismerkedés a teljes készlet minimális mélysége levelek egy kicsit nehezebb. Azt hiszem, megy egy iteratív mélyülő stratégiát .
Kideríteni, hogy milyen szintet a csomópont egy.
Három lehetőség közül választhat:
Keresse meg a csomópont első és a keresési le a fát érte. Úgy hangzik, pazarló, de ez a második kereső igényel látogató csak annyi csomópont a szint, így igazán gyors.
Másik megoldás lehet nyomon követni, ahogy megy. Használja három számlálók levelCounter, thisLevelCounterés nextLevelCounter. Minden alkalommal, amikor több új csomópontot csökkentéséhez thisLevelCounter, és amikor eléri a nullát, ha elköltözött Egy szinttel lejjebb, így nem
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Minden alkalommal, amikor egy gyermek csomópont a keresési listán, megnöveljük nextLevelCounter. Minden alkalommal, amikor tárolja az új gyermek csomópont növekménynextLevelCounter
Végül az iteratív mélyítése stratégia adja a siker szintjét ingyen (ami iteráció találja ...), és ugyanabban a sorrendben a teljesítmény (bár kissé magasabb szorzó), mint a szélessége első keresést.
Itt kódváltozaton (remélem nem marad ki semmilyen hiba ellenőrzés):
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);
}













