najít nejmenší hloubka koncový uzel v BST

hlasů
1

Třeba získat koncový uzel, který má k dispozici minimální hloubku. Já si nemyslím, že dobrý způsob, jak to udělat, aniž by ukládání dodatečných informací v každém uzlu, prosím, naznačují, díky moc.

Položena 04/11/2011 v 01:03
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Brutální řešení síla je prohledávání do šířky končící na prvním listu nalezen, bude to jednodušší implementovat opakované než rekurzivně.

Viz například pseudo-kód v mé odpovědi na „Šířka First proti hloubce First“ jen přidat další podmínku pro cyklus while.

BTW - to se dostanete na list s minimální hloubkou, protože tam může být více než jeden v této hloubce. Získání kompletní sadu minimální hloubka listů je trochu těžší. Myslím, že jít s opakujícím se prohlubující strategii .


Zjistit, jaké úrovni, že uzel je jeden.

Tři možnosti:

Najít uzel první a hledání dolů stromu na něj. Zní to nehospodárné, ale ta druhá hledání vyžaduje návštěvu pouze tolik uzlů jako úrovni, takže je to opravdu rychle.

Případně můžete sledovat as you go. Použít tři čítače levelCounter, thisLevelCountera nextLevelCounter. Pokaždé, když se víc do nového uzlu dekrement thisLevelCounter, a když to klesne na nulu jste se přestěhovali dolů úroveň tak učinit

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

Pokaždé, když přidáte podřízený uzel do seznamu vyhledávání, zvýšit nextLevelCounter. Pokaždé, když uložíte novou dítě uzlu přírůsteknextLevelCounter

A konečně, iterativní prohlubování strategie vám dává úspěchem míru zadarmo (což je iterace najde ...) a má stejné pořadí výkonnosti (i když mírně vyšší multiplikátor) jako prohledávání do šířky.

Odpovězeno 04/11/2011 v 01:06
zdroj uživatelem

hlasů
0

Zde kód verze (doufám, že jsem neměl ujít žádnou kontrolu chyb):

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);
}
Odpovězeno 25/03/2013 v 09:31
zdroj uživatelem

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