Necesitatea de a obține nodul frunza care are o adâncime minimă. Nu pot gândi la o modalitate buna de a face acest lucru fără a stoca informații suplimentare în fiecare nod, vă rugăm să sugereze, mulțumesc foarte mult.
găsi cel mai mic nod de frunze adâncime în BST
Soluția brute force este o lățime prima căutare terminându-se la prima frunză găsit, acest lucru va fi mai ușor să pună în aplicare iterativ decât recursiv.
A se vedea , de exemplu , pseudo-cod în răspunsul meu la „Latime Prima Vs Profunzimea Primul“ este suficient să adăugați o altă condiție în timp ce-bucla.
BTW - Acest lucru vă va primi o frunză cu adâncimea minimă, deoarece pot exista mai multe la adâncimea. Obținerea de setul complet de frunze minime de adâncime este un pic mai greu. Cred că merg cu o strategie de aprofundare iterativ .
Aflând ce nivel acel nod este unul.
Trei opțiuni:
Găsiți primul nod și căutarea în jos copac pentru ea. Sună risipitor, dar că a doua căutare necesită vizita doar cât mai multe noduri ca nivel, așa că într-adevăr este rapid.
Alternativ , puteți ține evidența ca te duci. Utilizați trei contoare levelCounter, thisLevelCounterși nextLevelCounter. De fiecare dată când mai mult la un nou nod te decrement thisLevelCounter, și când ajunge la zero v - ați mutat în jos un nivel atât de a face
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
De fiecare dată când adăugați un nod copil în lista de căutare, incrementa nextLevelCounter. De fiecare dată când stocați un nou nod creștere copilnextLevelCounter
În cele din urmă, strategia de adâncire iterativ vă oferă nivelul sucess gratuit (care iterație găsește ...) și are aceeași ordine de performanță (deși un multiplicator ușor mai mare), ca lățimea de căutare prima.
Aici versiune cod (sper că nu am dor de nici o verificare de eroare):
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);
}













