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.
encontrar el nodo hoja profundidad más pequeña en bst
fuente por usuario Shang Wang
En otros idiomas...
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.
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);
}