Sie möchten die Blattknoten erhalten, die minimale Tiefe hat. Ich kann mich nicht einen guten Weg, es zu tun, ohne in jedem Knoten zusätzliche Informationen zu speichern, bitte vorschlagen, Dank sehr viel.
findet den kleinsten Tiefen Blattknoten in bst
quelle vom benutzer Shang Wang
In anderen Sprachen...
Die Brute-Force-Lösung ist eine Breitensuche endet am ersten Blatt gefunden, wird dies einfacher sein, iterativ zu implementieren als rekursiv.
Siehe zum Beispiel die Pseudo-Code in meiner Antwort auf „Breite Erste Vs Tiefe First“ fügen Sie einfach eine weitere Bedingung der while-Schleife.
BTW - Das wird Sie erhält ein Blatt mit der minimalen Tiefe, da es in dieser Tiefe mehr als eine sein kann. Immer den vollen Satz von Mindesttiefe Blättern ist ein wenig härter. Ich denke , gehen mit einer iterativen Vertiefung Strategie .
Herausfinden, was Niveau, dass Knoten ist.
Drei Möglichkeiten:
Finden Sie den Knoten erste und die Suche nach unten den Baum für sie. Es klingt verschwenderisch, aber die zweite Suche erfordert nur so viele Knoten wie das Niveau zu besuchen, so ist es wirklich schnell.
Alternativ können Sie verfolgen , wie Sie gehen. Mit drei Zähler levelCounter, thisLevelCounterund nextLevelCounter. Jedes Mal , wenn Sie mehr auf einen neuen Knoten Sie verringern thisLevelCounter, und wenn es Null trifft Sie eine Ebene verschoben haben nach unten , so tun
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Jedes Mal , wenn Sie einen untergeordneten Knoten zum Suchliste hinzuzufügen, zu erhöhen nextLevelCounter. Jedes Mal , speichern Sie einen neuen untergeordneten Knoten SchrittnextLevelCounter
Schließlich gibt die iterative Vertiefung Strategie Ihnen die Erfolg Ebene kostenlos (die Iteration es findet ...) und hat die gleiche Reihenfolge der Leistung (wenn auch einen etwas höheren Multiplikator) als Breitensuche.
Hier Code-Version (hoffe, ich habe verpassen keine Fehlerprüfung):
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);
}