Trzeba uzyskać węzeł liścia, który ma minimalną głębokość. Nie mogę myśleć o dobrym sposobem, aby to zrobić bez zapisywania dodatkowych informacji w każdym węźle, proszę sugerować, dzięki bardzo.
znaleźć najmniejszą głębokość węzła liścia w BST
Brute force to rozwiązanie wszerz wyszukiwania kończące się przy pierwszym liściem znaleziony, będzie to łatwiejsze do wdrożenia niż iteracyjnie rekurencyjnie.
Patrz na przykład pseudo-kod w mojej odpowiedzi na „Głębokość Szerokość Pierwszy Pierwszy Vs” wystarczy dodać kolejny warunek do pętli while.
BTW - to będzie Ci się liść z minimalną głębokość, ponieważ nie może być więcej niż jeden na tej głębokości. Uzyskanie pełnego zestawu minimalnych liści głębokość jest trochę trudniej. Chyba iść z iteracyjnej strategii pogłębiania .
Dowiedzieć się, co poziom, który węzeł jest jeden.
Trzy możliwości:
Znajdź pierwszy węzeł i poszukiwania w dół drzewa dla niego. Brzmi marnotrawstwem, ale drugi wyszukiwania wymaga wizyty tylko tyle węzłów jak poziom, więc jest to naprawdę szybko.
Alternatywnie można śledzić na bieżąco. Za pomocą trzech liczników levelCounter, thisLevelCountera nextLevelCounter. Za każdym razem więcej do nowego węzła Decrement thisLevelCounter, a gdy spadnie do zera już przesunęła się w dół poziom tak zrobić
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Za każdym razem, gdy dodać węzeł podrzędny na liście wyszukiwania, przyrost nextLevelCounter. Za każdym razem można przechowywać nowy węzeł dziecko przyrostnextLevelCounter
Wreszcie, iteracyjny strategia pogłębienie daje poziom sucess za darmo (co iteracja uzna to ...) i ma taką samą kolejność wykonywania (choć nieco wyższy mnożnik) jako przeszukiwanie wszerz.
Tutaj wersja kodu (mam nadzieję, że nie przegapić żadnej kontrolę błędów):
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);
}













