encontrar el nodo hoja profundidad más pequeña en bst

votos
1

Se necesita descargar el nodo hoja que tiene una profundidad mínima. No puedo pensar en una buena manera de hacerlo sin almacenar información adicional en cada nodo, por favor, sugiera, muchas gracias.

Publicado el 04/11/2011 a las 01:03
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

La solución de la fuerza bruta es una terminación búsqueda en amplitud en la primera hoja encontrado, esto será más fácil de implementar de forma iterativa de forma recursiva.

Véase, por ejemplo, el pseudo-código en mi respuesta a "Amplitud Primera Vs Profundidad primero" sólo tiene que añadir otra condición a la bucle while.

BTW - Esto le dará una hoja con la profundidad mínima, ya que puede haber más de una a esa profundidad. Conseguir el conjunto completo de hojas de profundidad mínima es un poco más difícil. Supongo que ir con una estrategia de profundización iterativa .


Averiguar qué nivel que el nodo es uno.

Tres opciones:

Encontrar el primer nodo y la búsqueda por el árbol para ello. Suena un desperdicio, pero eso segunda búsqueda requiere visitar sólo tantos nodos como el nivel, por lo que realmente es rápida.

Alternativamente se puede seguir la pista a medida que avanza. Utiliza tres contadores levelCounter, thisLevelCountery nextLevelCounter. Cada vez más a un nuevo nodo decrementas thisLevelCounter, y cuando llega a cero se ha mudado a un nivel inferior también lo hacen

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

Cada vez que se añade un nodo secundario a la lista de búsqueda, incremente nextLevelCounter. Cada vez que se almacena un nuevo incremento nodo hijonextLevelCounter

Por último, la estrategia de profundización iterativa le da el nivel de éxito de forma gratuita (que se encuentra iteración ...) y tiene el mismo orden de actuación (aunque un multiplicador ligeramente superior) como la búsqueda en anchura.

Respondida el 04/11/2011 a las 01:06
fuente por usuario

votos
0

Aquí la versión de código (espero que no me perdí ninguna comprobación de errores):

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);
}
Respondida el 25/03/2013 a las 09:31
fuente por usuario

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