znaleźć najmniejszą głębokość węzła liścia w BST

głosy
1

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.

Utwórz 04/11/2011 o 01:03
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

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.

Odpowiedział 04/11/2011 o 01:06
źródło użytkownik

głosy
0

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);
}
Odpowiedział 25/03/2013 o 09:31
źródło użytkownik

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