Kürzeste Zweig in einem binären Baum?

stimmen
1

Ein Binärbaum kann mit zwei Funktionen codiert werden lund r so daß für ein node n, l(n)das linke Kind geben n, r(n) das Recht geben , Kind n.

Ein Ast eines Baumes ein Pfad von der Wurzel zu einem Blatt ist, wird die Länge eines Zweiges auf ein bestimmtes Blatt ist die Anzahl von Bögen auf dem Weg von der Wurzel zu diesem Blatt.

Lassen Sie uns MinBranch(l,r,x)ein einfacher rekursiver Algorithmus sein , um einen binären Baum von den L und R - Funktionen zusammen mit dem Wurzelknoten x für den binären Baum codiert Aufnahme und gibt die Länge des kürzesten Zweig des binären Baums.

Geben Sie den Pseudo-Code für diesen Algorithmus.

OK, so dass im Grunde ist es das, was ich mit so weit habe kommen:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

Natürlich ist dies nicht groß oder perfekt. Ich wäre dankbar, wenn die Leute können mir diese perfekten und Arbeits erhalten helfen - jede Hilfe geschätzt wird.

Veröffentlicht am 28/08/2009 um 05:07
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
3

Ich bezweifle, jemand Hausaufgaben für Sie straight-up lösen. Ein Hinweis: Der Rückgabewert muss sicherlich höher wachsen als der Baum größer wird, nicht wahr? Allerdings sehe ich keine Zahlenliterale in Ihrer Funktion außer 0, und keine zusätzlich Betreiber entweder. Wie werden Sie immer größere Zahlen zurückkehren?

Einem anderen Blickwinkel auf das gleiche Problem: zu jeder Zeit Sie eine rekursive Funktion schreiben, hilft es aufzuzählen „ was alle sind die Bedingungen , unter denen ich aufhören soll mich anrufen , was ich in jedem Umstand zurückkehren?“

Beantwortet am 28/08/2009 um 05:15
quelle vom benutzer

stimmen
2

Du bist auf dem richtigen Weg, aber du bist nicht ganz da; Ihre rekursiven Algorithmus wird immer wieder zurückkehren 0. (die Logik ist fast richtig, aber ...)

beachten Sie, dass die Länge der Unterzweige ist eins weniger als die Länge des Zweiges; so left_oneund right_onesollte 1 + MinBranch....

Steping durch den Algorithmus mit einigen Probebäume helfen Off-by-one Fehler wie diese aufzudecken ...

Beantwortet am 28/08/2009 um 05:16
quelle vom benutzer

stimmen
0

Was Sie erstellt haben kann als eine Tiefensuche gedacht werden. Angesichts der Tatsache, was Sie nach (kürzester Zweig) sind, kann dies nicht der meisten efficent Ansatz. Denken Sie darüber nach, wie Sie Ihr Algorithmus auf einem Baum durchführen würde, die sehr schwer auf der linken Seite war (von dem Wurzelknoten), hatten aber nur einen Knoten auf der rechten Seite.

Hinweis: Betrachten Sie eine Breitensuche Ansatz.

Beantwortet am 28/08/2009 um 05:19
quelle vom benutzer

stimmen
0

Was haben Sie sieht es wie ein Tiefensuchalgorithmus, der den gesamten Baum suchen, bevor Sie mit einer Lösung zu kommen. was Sie brauchen , ist die Breitensuche Algorithmus, sobald es um die Lösung findet , ohne dabei eine komplette Suche zurückkehren

Beantwortet am 28/08/2009 um 05:19
quelle vom benutzer

stimmen
1

Es sieht aus wie Sie es fast, aber betrachten Sie dieses Beispiel:

      4

   3     5

Wenn Sie verfolgen durch MinBranch, werden Sie , dass in Ihrem siehe MinBranch(l,r,4)Aufruf:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

Das macht Sinn, immerhin 3 ist ein Blattknoten, so natürlich die Entfernung zum nächsten Blattknoten ist 0. Das gleiche gilt für right_one geschieht.

Aber Sie wickeln dann hier oben:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

aber das ist eindeutig falsch, da dieser Knoten (4) ist kein Blattknoten. Ihr Code vergessen haben, den aktuellen Knoten zu zählen (oops!). Ich bin sicher, Sie können verwalten, dies zu beheben.


Nun, tatsächlich, sie Art und Weise tun Sie dies nicht der schnellste ist, aber ich bin nicht sicher, ob das für diese Übung relevant ist. Betrachten wir diesen Baum:

         4
       3   5
     2
   1

Ihr Algorithmus den linken Zweig rekursiv zählen, obwohl es könnte, hypothetisch, aus der Patsche helfen, wenn Sie zuerst den rechten Zweig gezählt und festgestellt, dass 3 eine linke hat, so ist es deutlich länger als 5 (das ist ein Blatt). Aber natürlich zuerst die rechte Zweig Zählen funktioniert nicht immer!

Stattdessen mit kompliziertem Code, und wahrscheinlich einen Kompromiss von mehr Speichernutzung, können Sie Knoten überprüfen links nach rechts, von oben nach unten (wie Englisch Lesereihenfolge) und am ersten Blatt stoppen Sie.

Beantwortet am 28/08/2009 um 05:20
quelle vom benutzer

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