findet den kleinsten Tiefen Blattknoten in bst

stimmen
1

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.

Veröffentlicht am 04/11/2011 um 01:03
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

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.

Beantwortet am 04/11/2011 um 01:06
quelle vom benutzer

stimmen
0

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);
}
Beantwortet am 25/03/2013 um 09:31
quelle vom benutzer

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