Binärbaum -Vorbestellung in Java

Binärbaum -Vorbestellung in Java
Ein Baum im Computer ist wie ein Baum im Wald, aber er hat keinen Stiel. Es ist verkehrt herum. Es hat Zweige und Knoten. Es gibt nur eine Wurzel, die ein Knoten ist. Knoten werden durch einzelne Zweige von oben nach unten verknüpft. Es gibt kein horizontaler Verknüpfung. Das folgende Diagramm ist ein Beispiel für einen Baum.

Dies ist eigentlich ein binärer Baum. Ein binärer Baum ist ein Baum, an dem jeder Knoten höchstens zwei Kinderknoten hat. Wenn ein Knoten nur einen untergeordneten Knoten hat, sollte dieser Knoten der linke Knoten gemacht werden. Wenn es beide Kinder hat, gibt es einen linken Knoten und einen rechten Knoten.

Baumvokabular

Erläuterung des Baumquellens erfolgt mit dem Baumvokabular.

Wurzelknoten: Jeder Knoten in einem Baum hat einen Elternteil außer dem Wurzelknoten.
Blattknoten: Die Endknoten sind Blattknoten. Ein Blattknoten hat kein Kind.
Taste: Dies ist der Wert eines Knotens. Es kann ein primitiver Datentyp -Wert oder ein Zeichen sein. Es kann auch ein Bediener sein, e.G., + ot - .
Ebenen: Ein Baum ist in Stufen organisiert, wobei der Wurzelknoten auf der ersten Ebene. Die Knoten können in horizontalen Ebenen vorgestellt werden. Der obige Baum hat vier Ebenen.
Elternknoten: Der Stammknoten ist der einzige Knoten, der kein Elternteil hat. Jeder andere Knoten hat einen übergeordneten Knoten.
Geschwisterknoten: Die Kinder eines bestimmten Knotens sind Geschwisterknoten.
Weg: Ein Pfad ist eine Reihe von Knoten und ihren einzelnen Zweigen.
Vorfahrknoten: Alle höheren Knoten, die mit einem Kind verbunden sind, einschließlich des Elternteils und des Wurzelknotens, sind Vorfahrknoten.
Nachkommenknoten: Alle unteren Knoten, die mit einem bestimmten Knoten angeschlossen sind, sind nach unten an verbundene Blätter nachkommensfeste Knoten. Der fragliche Knoten ist nicht Teil der Nachkommenknoten. Der fragliche Knoten muss nicht der Stammknoten sein.
Subtree: Ein Knoten plus alle seine Nachkommen, bis hin zu den verwandten Blättern, bilden Sie einen Subtree. Der Startknoten ist enthalten und muss nicht die Wurzel sein; Ansonsten wäre es der ganze Baum.
Grad: Der Knoten eines binären Baumes kann ein oder zwei Kinder haben. Wenn ein Knoten ein Kind hat, soll sein Abschluss eines sein. Wenn es zwei Kinder hat, soll sein Abschluss zwei sein.

In diesem Artikel wird erklärt.

Artikelinhalt

  • Traversalmodell
  • Der Traversalansatz illustriert
  • Java -Klassen
  • Die main () Methode
  • Abschluss

Traversalmodell

Aufträge

Der kleinste typische Unterbaum eines binären Baums besteht aus einem Elternknoten und zwei Kinderknoten. Die Kinderknoten sind Geschwister aus dem linken Kinderknoten und dem rechten Kinderknoten. Ein richtiger Kinderknoten kann nicht vorhanden sein.

Vorbestellen

Der übergeordnete Knoten wird zuerst mit dieser Reihenfolge, dann des linken Knotens und dann des rechten Knotens besucht. Wenn der linke Knoten einen eigenen Unterbaum hat, werden alle Subbree -Knoten zuerst besucht, bevor der rechte Knoten besucht wird. Wenn der richtige Knoten einen eigenen Subtree hat, wird der gesamte Unterbaum zuletzt besucht. Bei einem Unterbaum wird das Vorbestellungsschema des Eltern-Links-Rechts für jedes Dreieck von drei Knoten befolgt. Wenn ein Knoten nur ein Kind hat, was bedeutet, dass es kein wirkliches Dreieck gibt, sollte das einzige Kind als der linke Knoten betrachtet werden.

Postorder

Der linke Knoten wird zuerst mit dieser Reihenfolge, dann des rechten Knotens und dann des übergeordneten Knotens besucht. Wenn der linke Knoten einen eigenen Unterbaum hat, werden alle Subbree -Knoten zuerst besucht, bevor der rechte Knoten besucht wird. Wenn der richtige Knoten einen eigenen Unterbaum hat, wird der gesamte Unterbaum zweite besucht, bevor der Elternteil besucht wird. Bei einem Unterbaum wird das nach der Bestellung von links-rechts-Eltern-Schema für jedes Dreieck von drei Knoten befolgt.

In Ordnung

Der linke Knoten wird zuerst mit dieser Reihenfolge, dann des übergeordneten Knotens und dann des rechten Knotens besucht. Wenn der linke Knoten einen eigenen Unterbaum hat, werden alle Subbree -Knoten zuerst besucht, bevor der übergeordnete Knoten besucht wird. Wenn der richtige Knoten einen eigenen Subtree hat, wird der gesamte Unterbaum zuletzt besucht. Bei einem Teilbaum wird das in Ordnung von links-Parent-Rechts-Schema für jedes Dreieck von drei Knoten verfolgt.

In diesem Artikel wird nur das Vorbestellungsschema veranschaulicht.

Rekursion oder Iteration

Das Vorbestellungsschema kann entweder mit Rekursion oder Iteration implementiert werden. In diesem Artikel wird die einzige Rekursion veranschaulicht.

Der Traversalansatz illustriert

In diesem Artikel werden das Vorbestellungsschema und die Rekursion verwendet. Das obige Diagramm wird verwendet. Das Diagramm wurde hier als einfache Referenz neu gespielt:

In diesem Abschnitt wird dieses Diagramm verwendet, um die angezeigte Abfolge von Werten (Buchstaben) anzuzeigen (zugegriffen) unter Verwendung des Vorbestellschemas und der Rekursion. Die Buchstaben a, b, c usw., sind die Werte (Schlüssel) der verschiedenen Knoten.

Vorbestellungszugang zum Baum beginnt von der Wurzel. A ist also zuerst der Zugang. A hat zwei Kinder: B (links) und C (rechts). Vorbestellung ist Eltern-Links-Rechts-Recht. So wird als nächstes auf B zugegriffen. Wenn B nie Kinder hätte, wäre C als nächstes zugegriffen worden. Da B Kinder hat: D (links) und E (rechts), muss das linke Kind als nächstes zugegriffen werden. Erinnern Sie sich daran, dass Vorbestellung für Eltern-Links-Rechts-Rechts ist. Nach B wurde auf das Elternteil zugegriffen, auf sein linkes Kind D muss als nächstes zugegriffen werden.

Das Dreieck für den übergeordneten Knoten B ist BDE. In diesem Dreieck wurde gerade auf den übergeordneten Knoten, gefolgt vom linken Kinderknoten, zugegriffen. Der Zugriff auf alle Knoten des Dreiecks muss zuerst abgeschlossen sein. Der nächste zugegriffene Knoten ist also das richtige Kind des Knotens B, nämlich e.

Jetzt ist das Dreieck BDE ein Subtree, der vom Knoten B geführt wird. Zu diesem Zeitpunkt wurde der Knoten B und sein Dreieck vollständig zugegriffen. Knoten B ist das linke Kind des Knotens a. Der Zugang des Knotens B und dessen Subtree wurde gerade abgeschlossen. Nach dem Links-Rechts-Rechtsrecher.

Das Dreieck, das C führt. C ist der Elternteil, f ist das linke Kind und G ist das rechte Kind. Sobald auf C zugegriffen wurde, muss auf F nach der Regel der Eltern-Links-Rechts-Rechte zugegriffen werden. F hat auch ein Kind, h. Sobald auf F zugegriffen wurde, muss das linke Kind H von der Regel für Eltern-Links-Rechts-Rechte zugegriffen werden.

Danach wären auf F und sein Subtree vollständig zugegriffen worden. Zu diesem Zeitpunkt würde es keine Frage geben, wieder auf F zugreifen zu können. F ist das linke Kind von C, das ein rechtes Kind hat, G. Nach dem linken Kind wurde auf F vollständig zugegriffen, auf das rechte Kind G, der dann von der Regel für Eltern-Links-Rechts-Rechte zugegriffen werden muss.

Und so lautet die Zugriffssequenz: ABDECFHG.

Java -Klassen

Der Baum wird hier als leichte Referenz neu gespielt:

Knoten

Buchstabe) des Knotens. Es sollte auch zwei weitere Eigenschaften haben, die nach links und rechts benannt sind. Die linke Eigenschaft wird ein untergeordneter Knoten zugewiesen, wenn der Knoten ein linkes Kind hat. Die richtige Eigenschaft wird mit dem "A" -Stichtknoten zugewiesen, wenn der Knoten "ein" richtiges Kind hat.

Die Knotenklasse benötigt einen Konstruktor, der das Knotenobjekt erstellt und dem Schlüssel einen Wert zuweist. Der Code für die Klasse lautet:

Klassenknoten
Zeichenschlüssel;
Knoten links, rechts;
öffentlicher Knoten (Zeichenwert)
Schlüssel = Wert;
links = rechts = null;

Wenn nur ein Knoten erstellt wird, hat er kein Kind. Deshalb werden den linken und rechten Eigenschaften null zugewiesen. Wenn in der main () -Methode ein bestimmter Knoten ein linkes Kind hat, wird das Kind erstellt und der linken Eigenschaft des jeweiligen Knotens zugeordnet. Wenn ein bestimmter Knoten ein richtiges Kind hat, wird das Kind erstellt und der richtigen Eigenschaft des jeweiligen Knotens zugeordnet.

Die Baumklasse

Der Code für die Baumklasse lautet:

Klasse BinaryTree
Knotenwurzel;
BinaryTree ()
root = null;

Die Baumklasse zeigt die Wurzel an. Es hat eine Eigenschaft namens Root, die für den Stammknoten ist. Es hat einen Konstruktor ohne Parameter. Dieser Konstruktor weist der Wurzel Null zu. Wenn nur ein Baum erstellt wird, hat er keinen Knoten, und deshalb ist die Eigenschaftswurzel null. Der erste erstellte Knoten ist der Stammknoten und wird dieser Eigenschaft zugewiesen, Root. Von dort aus wächst der Baum in der Main () -Methode (siehe unten).

Die BinaryTree -Klasse hat die Methoden vorbestellt () und main () siehe unten.

Die Vorbestellungsmethode

Dies ist der Kern des Programms, obwohl die main () -Methode auch wichtig ist. Die Vorbestellungsmethode implementiert die Regel für Eltern-Links-Rightchild. Dies ist eine rekursive Funktion, deren Code ist:

void vorbestellt (Knotenknoten)
if (node ​​== null)
zurückkehren;
// Zugriff auf den übergeordneten Knoten zugreifen
System.aus.Druck (Knoten.Schlüssel + "->");
// Zugriff auf das linke Kind zugreifen
Vorbestellung (Knoten.links);
// Zugriff auf das richtige Kind zugreifen
Vorbestellung (Knoten.Rechts);

Am Ende des Baumquellens wird kein Knoten durchqueren, sodass der Wert eines Knotens null ist. Dies macht die erste Anweisung in der Vorbestellungsfunktion aus. Die zweite Anweisung druckt den Schlüssel des aktuellen Knotens. Die dritte Anweisung erinnert an die gleiche Vorbestellungsfunktion mit dem linken Kinderknoten. Die nächste und letzte Anweisung erinnert an die Vorbestellungsfunktion mit dem richtigen Kinderknoten. Auf diese Weise wird der ganze Baum durchquert.

Bei der Anzeige der Sequenz A-> B-> D nach B zugegriffen wurde „Vorbestellung (Knoten.rechts) ”ist für den Knoten C aufgerufen, aber reserviert. Nach D zugegriffen wurde: „Vorbestellung (Knoten.rechts) ”ist für den Knoten e aufgerufen. Der Aufruf für den reservierten Knoten C wird danach ausgeführt. Diese Erklärung gilt für den richtigen Zweig des gesamten Baumes.

Und so sollte die Ausgangssequenz sein: a-> b-> d-> e-> c-> f-> h-> g .

Die main () Methode

Die Hauptmethode erstellt den Baum, indem es der linken oder rechten Eigenschaft eines übergeordneten Knotens neue Knoten mit ihren Schlüssel zuweist. Erstens wird ein leerer Baum erstellt. Am Ende der Main () -Methode wird die Vorbestellmethode einmal aufgerufen. Da es sich um eine rekursive Funktion handelt, ruft es sich weiter an, bis der gesamte Baum durchquert wurde. Der Code ist:

public static void main (String [] args)
// Erstellen Sie das Baumobjekt ohne Knoten
BinaryTree Tree = New BinaryTree ();
// Knoten für den Baum erstellen
Baum.root = new node ('a');
Baum.Wurzel.links = neuer Knoten ('B');
Baum.Wurzel.rechts = neuer Knoten ('C');
Baum.Wurzel.links.links = neuer Knoten ('D');
Baum.Wurzel.links.Right = neuer Knoten ('e');
Baum.Wurzel.Rechts.links = neuer Knoten ('f');
Baum.Wurzel.Rechts.right = neuer Knoten ('g');
Baum.Wurzel.Rechts.links.links = neuer Knoten ('H');
// Baumtraversal vorbestellen
System.aus.println ("Vorbestellungen");
Baum.Vorbestellung (Baum.Wurzel);
System.aus.println ();

Alle oben genannten Codes können in ein Programm zum Testen zusammengestellt werden.

Die Ausgabe ist:

A-> b-> d-> e-> c-> f-> h-> g->

Das letzte -> kann ignoriert werden.

Abschluss

Die Binärbaumvorbestellung in Java, die Rekursion verwendet, hat zwei Klassen. Es hat die Knotenklasse und die BinaryTree -Klasse. Die Knotenklasse hat eine Eigenschaft für den Schlüssel. Es hat auch zwei Knoteneigenschaften für den linken Kinderknoten und den rechten Kinderknoten. Die BinaryTree -Klasse hat zwei Methoden: die methode vorbestellt () und die main () -Methode. Die vorbestellte () -Methode implementiert das Elternschema für Eltern-Links-Rightchild rekursiv. Die main () -Methode baut den Baum auf, indem sie den Elternknoten neue Knoten mit ihren Schlüssel als linke und rechte Kinder zuweist.

Das Problem mit dem rekursiven Algorithmus zur Vorbestellung ist, dass, wenn der Baum zu groß ist, die Erinnerung kurz wird. Um dieses Problem zu lösen, verwenden Sie den iterativen Algorithmus - siehe später.