Vous avez besoin d'obtenir le nœud feuille a une profondeur minimale. Je ne peux pas penser à une bonne façon de le faire sans stocker des informations supplémentaires dans chaque noeud, s'il vous plaît suggérer, merci beaucoup.
trouver le nœud feuille de profondeur plus petite bst
La solution de la force brute est une terminaison de recherche en largeur d'abord à la première feuille trouvée, ce sera plus facile à mettre en œuvre itérativement que récursive.
Voir par exemple le pseudo-code dans ma réponse à « Première Vs Profondeur Largeur d' abord » d' ajouter une autre condition à la boucle while.
BTW - Cela vous obtenez une feuille avec la profondeur minimale, car il peut y avoir plus d'une à cette profondeur. Obtenir l'ensemble des feuilles de profondeur minimum est un peu plus difficile. Je suppose que d' aller avec une stratégie d'approfondissement itérative .
Savoir quel niveau de ce noeud est un.
Trois choix:
Trouver le premier noeud et la recherche dans l'arbre pour elle. Il semble inutile, mais cette seconde recherche nécessite la visite que autant de nœuds que le niveau, il est donc très rapide.
Alternativement , vous pouvez garder une trace que vous allez. Vous utilisez trois compteurs levelCounter, thisLevelCounteret nextLevelCounter. Chaque fois que vous plus à un nouveau nœud décrémentez thisLevelCounter, et quand il atteint zéro que vous avez déplacé vers le bas un niveau si faire
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Chaque fois que vous ajoutez un nœud enfant à la liste de recherche, incrémenter nextLevelCounter. Chaque fois que vous programmez un nouvel incrément de nœud enfantnextLevelCounter
Enfin, la stratégie d'approfondissement itérative vous donne le niveau sucess gratuitement (ce qui le trouve itération ...) et a le même ordre d'exécution (si un multiplicateur légèrement plus élevé) que la première recherche étendue.
Voici la version de code (espère que je ne manque aucun contrôle d'erreur):
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);
}













