2,3-Baum rekursiv erstellen

drose_1

Mitglied
Hallo, folgendes Problem:
wie lässt sich ein 2-3-Baum rekursiv erstellen?
Genauer gesagt ich gebe in den Konstruktor der Klasse ein sortiertes Array(z.B int a[] = {1,2,3,4,5,6,7,8,9,10}) und daraus soll dann der Konstruktor den Baum erstellen.
Zum 2-3-Baum:
Datensätze befinden sich nur in Blättern
Alle Nodes über den Blättern tragen Keys anstatt Datensätze
Jede Node kann bis zu 3 Keys tragen und min 2 und max 3 Kinder haben

Das Problem an der ganzen Sache ist das wir keine insert-Funktion implementieren sollen, was ich zunächst erstmal komisch finde.
Im Anhang liegt der skizzierte Baum vor der aus obigen Array entehren würde bei korrekter Implementerung.
Wäre nice wenn mir jemand Gedankenanstöße geben könnte wie man an diese Sache rangeht, ich möchte mir auch nicht die Lösung irgendwie erschleichen oder so, ich bin eigentlich ziemlich ehrgeizig was solche Datenstrukturen angeht aber momentan hab ich in der Sache gar kein Durchblick.
Normale Trees und Binary Search Trees sind mir geläufig, falls das irgendwie hilft.
Ich hätte hier noch ne Auflistung des Baumes in preOrder mit Blättern in <> geschrieben und Nodes mit Keys in () geschrieben:
(5,10)
(2,5)
(1,2)
<1>
<2>
(3,4,5)
<3>
<4>
<5>
(7,10)
(6,7)
<6>
<7>
(8,9,10)
<8>
<9>
<10>
 

httpdigest

Top Contributor
Zum 2-3-Baum: Datensätze befinden sich nur in Blättern
Das ist nicht, was man im Allgemeinen unter einem 2-3-Baum versteht. In einem 2-3-Baum enthalten sowohl innere Knoten als auch Blattknoten die Daten. Auf den Daten ist eine totale Ordnung definiert, so dass man zwei Daten "der Größe nach" miteinander vergleichen kann. Ein innerer Knoten kann 1 Datum beinhalten und 2 Kindknoten haben, oder er kann 2 Daten beinhalten und 3 Kindknoten haben. Im Falle, dass er 2 Kindknoten hat, gilt, dass alle Daten im linken Teilbaum (also alle Daten des ersten Kindbaumes) strikt kleiner (<) sind als das Datum im inneren Knoten. Entsprechend gilt, dass alle Daten im rechten Teilbaum strikt größer (>) sind als das Datum im inneren Knoten. Bei einem inneren Knoten mit 2 Daten gelten entsprechende Bedingungen für die drei Intervalle/Kindbäume.
Ich würde mal wagen zu sagen, dass der von dir gezeigte Beispielbaum falsch ist im Sinne, dass es keinen validen 2-3-Baum darstellt - oder es ist eine Abwandlung, für die eine klarere Definition nötig ist. Auch gibt es ja bei deinem Beispiel keinen Unterschied zwischen einem "Key", der laut deiner Definition in den inneren Knoten gespeichert ist, und dem tatsächlichen Datum, das in den Kindknoten gespeichert sein soll.
 

drose_1

Mitglied
Das ist nicht, was man im Allgemeinen unter einem 2-3-Baum versteht. In einem 2-3-Baum enthalten sowohl innere Knoten als auch Blattknoten die Daten. Auf den Daten ist eine totale Ordnung definiert, so dass man zwei Daten "der Größe nach" miteinander vergleichen kann. Ein innerer Knoten kann 1 Datum beinhalten und 2 Kindknoten haben, oder er kann 2 Daten beinhalten und 3 Kindknoten haben. Im Falle, dass er 2 Kindknoten hat, gilt, dass alle Daten im linken Teilbaum (also alle Daten des ersten Kindbaumes) strikt kleiner (<) sind als das Datum im inneren Knoten. Entsprechend gilt, dass alle Daten im rechten Teilbaum strikt größer (>) sind als das Datum im inneren Knoten. Bei einem inneren Knoten mit 2 Daten gelten entsprechende Bedingungen für die drei Intervalle/Kindbäume.
Ich würde mal wagen zu sagen, dass der von dir gezeigte Beispielbaum falsch ist im Sinne, dass es keinen validen 2-3-Baum darstellt - oder es ist eine Abwandlung, für die eine klarere Definition nötig ist. Auch gibt es ja bei deinem Beispiel keinen Unterschied zwischen einem "Key", der laut deiner Definition in den inneren Knoten gespeichert ist, und dem tatsächlichen Datum, das in den Kindknoten gespeichert sein soll.

ja wir haben die "Datensätze" der inneren Knoten einfach als Keys bezeichnet
der einzige Unterschied den wir zu allgemein bekannten 2-3-Bäumen haben ist, das innere Knoten bis zu 3 Datensätze tragen können und das die Datensätze links vom Knoten nicht strikt kleiner sein müssen sonder auch gleich groß sein darf, das gilt dann auch analog für rechte
 

drose_1

Mitglied
die Dreiteilung ist weiterhin intakt ob jetzt Datensätze < oder <= sind macht doch keinen unterschied, ich würde ja gerne ne Skizze vom baum hochladen aber die Forum-Software meckert ständig das die Bilder zu groß seien, was ist denn die maximale Dateigröße hier ?
 

httpdigest

Top Contributor
Bevor du dir Gedanken machst, wie der Baum aus der Liste der Zahlen aufgebaut wird, skizziere erstmal deine Datenstruktur. Algorithmen ergeben sich meist direkt aus den Datenstrukturen. Wie sieht deine Baum/Knoten-Klasse ganz exakt aus? Wie wird zwischen einem inneren Knoten und einem Blattknoten unterschieden? Wo/wie werden die Kindknoten eines inneren Knotens gespeichert und wo/wie wird das Datum eines Blattknotens gespeichert?
 

drose_1

Mitglied
Bevor du dir Gedanken machst, wie der Baum aus der Liste der Zahlen aufgebaut wird, skizziere erstmal deine Datenstruktur. Algorithmen ergeben sich meist direkt aus den Datenstrukturen. Wie sieht deine Baum/Knoten-Klasse ganz exakt aus? Wie wird zwischen einem inneren Knoten und einem Blattknoten unterschieden? Wo/wie werden die Kindknoten eines inneren Knotens gespeichert und wo/wie wird das Datum eines Blattknotens gespeichert?
So gesehen würde ich das in 3 Klassen teilen.
Einmal die Baumklasse: Mit einer root Node als Instanzvariable.
die innere Knoten Klasse : mit 3 Datensätzen zum Beispiel left , middle ,right (left < middle < right) und mit Verweisen auf bis zu 3 Kindknoten zum bespiel Node left_child, middle_child und right _child
und eine Blattknoten klasse : die nur einzelne Datensätze hält (z.B int Data;)

alles mit Getter und setter implementiert. Das wäre zunächst der Ansatz.
 

httpdigest

Top Contributor
Skizziere das doch mal ganz genau als Java Klassen. Und ich würde für die Datensätze in den Knoten und für die Verweise auf die Kindknoten wahrscheinlich schon eine java.util.List statt drei Instanzvariablen nehmen (twenn ihr dürft). Da es ja manchmal 2 und manchmal 3 sein können und wir viele if-Abfragen hier vermeiden wollen.
 

drose_1

Mitglied
Skizziere das doch mal ganz genau als Java Klassen. Und ich würde für die Datensätze in den Knoten und für die Verweise auf die Kindknoten wahrscheinlich schon eine java.util.List statt drei Instanzvariablen nehmen (twenn ihr dürft). Da es ja manchmal 2 und manchmal 3 sein können und wir viele if-Abfragen hier vermeiden wollen.
Code:
public class TwoThreeTree {

    private class insideNode {

        int data;
        insideNode left, middle, right, parent;

        insideNode(int data) { this.data = data; }

        insideNode getLeft() { return left; }
        insideNode getMiddle() { return middle; }
        insideNode getRight() { return right; }
        insideNode getParent() { return parent; }
        int getData() { return data; }
        void setData(int data) { this.data = data; }
        void setLeft(insideNode left) { this.left = left; }
        void setMiddle(insideNode middle) { this.middle = middle; }
        void setRight(insideNode right) { this.right = right; }
        void setParent(insideNode parent) { this.parent = parent; }
    }

    private class leafNode {

        int data;
        insideNode parent;

        leafNode(int data) {
            this.data = data;
        }

        int getData() { return data; }
        void setData(int newData) { this.data = newData; }
        insideNode getParent() { return parent; }
        void setParent(insideNode parent) { this.parent = parent; }
    }

    private insideNode root;

    TwoThreeTree(int[] a) {
        
    }
}

Hab den Konstruktor des Baumes jetzt offen gelassen, weil der komplette Baum ja über diesen enstehen soll.
Bisher bei Bäumen sind wir so verfahren das über ne Insertfunktion den Baum entsteht auf diese sollen wir aber ja verzichten.
 

httpdigest

Top Contributor
Denke mal noch etwas über deine Klassenhierarchie für die Knoten des Baumes nach. So funktioniert das noch nicht. Du kannst aktuell keine `leafNode` Instanzen speichern, da diese keine `insideNode` sind (btw.: in Java werden Typnamen IMMER "Groß" geschrieben, also `LeafNode` und `InsideNode` bzw. üblicher ist `InnerNode`).
 

drose_1

Mitglied
Denke mal noch etwas über deine Klassenhierarchie für die Knoten des Baumes nach. So funktioniert das noch nicht. Du kannst aktuell keine `leafNode` Instanzen speichern, da diese keine `insideNode` sind (btw.: in Java werden Typnamen IMMER "Groß" geschrieben, also `LeafNode` und `InsideNode` bzw. üblicher ist `InnerNode`).
Code:
package com.company.Übung11;

public class TwoThreeTree {

    private class InnerNode {

        int data;
        InnerNode left, middle, right, parent;
        LeafNode leftLeaf, middleLeaf, rightLeaf;

        InnerNode(int data) { this.data = data; }

        InnerNode getLeft() { return left; }
         InnerNode getMiddle() { return middle; }
        InnerNode getRight() { return right; }
        InnerNode getParent() { return parent; }
        int getData() { return data; }
        void setData(int data) { this.data = data; }
        void setLeft(InnerNode left) { this.left = left; }
        void setMiddle(InnerNode middle) { this.middle = middle; }
        void setRight(InnerNode right) { this.right = right; }
        void setParent(InnerNode parent) { this.parent = parent; }
        LeafNode getLeftLeaf() { return leftLeaf; }
        LeafNode getMiddleLeaf() { return middleLeaf;}
        LeafNode getRightLeaf() { return  rightLeaf;}
        void setLeftLeaf(LeafNode leftLeaf) {this.leftLeaf = leftLeaf;}
        void setMiddleLeaf(LeafNode middleLeaf) { this.middleLeaf = middleLeaf; }
        void setRightLeaf(LeafNode rightLeaf) { this.rightLeaf = rightLeaf; }
    }

    private class LeafNode {

        int data;
        InnerNode parent;

        LeafNode(int data) {
            this.data = data;
        }

        int getData() { return data; }
        void setData(int newData) { this.data = newData; }
        InnerNode getParent() { return parent; }
        void setParent(InnerNode parent) { this.parent = parent; }
    }

    private InnerNode root;

    TwoThreeTree(int[] a) {

    }
}

ok habs jetzt nochmal überarbeitet
 

httpdigest

Top Contributor
Nein, jetzt hast du viele unnötige Felder, von denen ja immer nur eine Hälfte gefüllt sein wird. Was du willst, ist eine Typhierarchie. Schau dir mal das "extends" Schlüsselwort in Java an, bzw. was Vererbung ist.
 

drose_1

Mitglied
Ja stimmt, das hab ich komplett vergessen.
Ich würde jetzt mal annehmen das die InsideNode von den LeafNodes erben, da diese ja ein paar Felder mehr haben.
 

drose_1

Mitglied
Also beide von einer separaten Node-Klasse ?
Aber irgendwie erscheint mir das eigenartig. Da innerNodes wesentlich mehr Felder besitzen als LeafNodes, auch wenn es Node sind ,sind diese doch schon ziemlich verschieden.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Da innerNodes wesentlich mehr Felder besitzen als LeafNodes, auch wenn es Node sind ,sind diese doch schon ziemlich verschieden.
Ist das so? Ein Blatt ist-ein Knoten, ein innerer Knoten ist-ein Knoten. So verschieden können die also gar nicht sein.

Du kannst einen Knoten nach seinen Einträgen fragen, Du kannst einen Knoten nach seinen Kindknoten fragen, Du kannst einen Knoten fragen, ob es sich um ein Blatt handelt...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Rekursiv Höhe Baum Allgemeine Java-Themen 3
E XML - Datei Darstellung in IntelliJ als Baum Allgemeine Java-Themen 2
Karl_Der_Nette_Anfänger Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur) Allgemeine Java-Themen 11
D Datentypen 2-3 Baum erstellen mit geordnetem int-array Allgemeine Java-Themen 0
L Dependency Injection für Baum-Einträge Allgemeine Java-Themen 9
M Iterator für trinären Baum Allgemeine Java-Themen 0
D Baum zeichnen hilfe Allgemeine Java-Themen 4
D if - else Baum vereinfachen Allgemeine Java-Themen 4
A AVL-Baum - Testen ob einer vorliegt Allgemeine Java-Themen 4
M Eclipse Stackoverflow beim Einlesen von großen Bilder in kd Baum Allgemeine Java-Themen 15
G Datentypen TreeMap nach Color sortiert (kd-Baum) Allgemeine Java-Themen 8
M Baum nach Stack plus Objektkonvertierung Allgemeine Java-Themen 5
S Baum mit vordefinierten Werten befüllen Allgemeine Java-Themen 2
D Datenstruktur für Hierarchie/Baum mit Tiefe 3 Allgemeine Java-Themen 8
D Rot-Schwart-Baum denkfehler im code? Allgemeine Java-Themen 6
M Baum Allgemeine Java-Themen 3
K Dependency Baum erstellen/analysieren Allgemeine Java-Themen 2
J Baum mit Adjazensmatrix Allgemeine Java-Themen 8
MQue Tidy HTML baum durchlaufen Allgemeine Java-Themen 5
C Breitendurchlauf Baum. Vorgehen unklar. Allgemeine Java-Themen 23
C Fehler im Quellcode. Suche in einem Baum Allgemeine Java-Themen 3
R Daten aus Baum entsprechend in jTree einfuegen Allgemeine Java-Themen 2
C Daten möglichst schnell einem Baum zuordnen Allgemeine Java-Themen 2
S Datenstruktur für einen Baum Allgemeine Java-Themen 5
N Baum aus Datei laden. Allgemeine Java-Themen 3
M Wie könnte man den Codeschnipsel rekursiv darstellen? Allgemeine Java-Themen 1
M Endrekursiv vs Rekursiv Allgemeine Java-Themen 4
Aboya Kugel mit Hilfe von Dreiecken rekursiv zeichnen Allgemeine Java-Themen 2
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
H Heron Verfahren Tail-rekursiv lösen Allgemeine Java-Themen 7
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
I Diskussion zu: Tribonacci Folge Rekursiv Allgemeine Java-Themen 15
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
denny86 NetBeans Ordnernamen rekursiv auslesen und in Variable verarbeiten Allgemeine Java-Themen 38
B Primfaktorzerlegung Rekursiv Allgemeine Java-Themen 2
B Primzahltest rekursiv Allgemeine Java-Themen 15
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
L Alle möglichen Additionen (Rekursiv) Allgemeine Java-Themen 3
H Vektor rekursiv erzeugen Allgemeine Java-Themen 2
J Breitensuche in Graph rekursiv Allgemeine Java-Themen 2
E ordner rekursiv durchsuchen Allgemeine Java-Themen 6
E Ordner rekursiv kopieren Allgemeine Java-Themen 8
R synchronized methode rekursiv aufrufen Allgemeine Java-Themen 5
S MergeSort iterativ und rekursiv? Allgemeine Java-Themen 8
G Array rekursiv durchlaufen Allgemeine Java-Themen 2
S JAVA JTree rekursiv umschreiben Allgemeine Java-Themen 5
leifg Rekursiv mit Threads Programmieren Allgemeine Java-Themen 2
sparrow Ant build-files rekursiv aus ant aufrufen Allgemeine Java-Themen 3
K zinsen rekursiv/iterativ Allgemeine Java-Themen 17
K Verzeichnis rekursiv aus JAR-Datei extrahieren Allgemeine Java-Themen 6
F Filelisting iterativ, nicht rekursiv Allgemeine Java-Themen 7
L Spielerei: Frame rekursiv darstellen Allgemeine Java-Themen 3
M Rekursiv Verzeichnisse ansehen und auf Muster matchen Allgemeine Java-Themen 6
Zrebna Testkonzept erstellen - Verständnisschwierigkeiten Allgemeine Java-Themen 6
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
berserkerdq2 SceneBuilder GUI erstellt, nun muss ich noch ein Polygon erstellen, ist die Connection möglich? Allgemeine Java-Themen 3
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
D Open Source Library zum erstellen von PDFs Allgemeine Java-Themen 1
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
J Power Point erstellen inklusive Diagramm Allgemeine Java-Themen 12
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
N Tree erstellen Allgemeine Java-Themen 8
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
berserkerdq2 Kann keine Labels erstellen, was ist hier syntaktisch falsch Allgemeine Java-Themen 5
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Trace-Tabelle erstellen Allgemeine Java-Themen 3
M Excel Datei Erstellen Allgemeine Java-Themen 2
OnDemand Erstellen von Quartz Jobs pro Aufgabe oder zusammenfassen Allgemeine Java-Themen 7
H Matrix ohne Array erstellen Allgemeine Java-Themen 9
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
Avalon DTO aus mehrere Entitäten erstellen Allgemeine Java-Themen 5
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
M Registry Autostart Eintrag mit Java erstellen (über Windows cmd) Allgemeine Java-Themen 7
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
M Java 2D Array für ein Grid erstellen ? Allgemeine Java-Themen 2
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
M Rectangle mit Java erstellen? Allgemeine Java-Themen 9
G Fläche erstellen mit Entfernungen Allgemeine Java-Themen 1
E Eigenen "Aufzählungstyp" erstellen - mit enum ? Allgemeine Java-Themen 18
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
B Rangliste erstellen Allgemeine Java-Themen 13
L SQL Datei in Eclipse erstellen Allgemeine Java-Themen 3
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
E Ts3API Subchannel erstellen und rein moven !! Allgemeine Java-Themen 0
J Eigene Api erstellen und dann auch verwenden - Ordnerstruktur Allgemeine Java-Themen 1
S GetMethode erstellen mit Hilfe von Parametern Allgemeine Java-Themen 9
T 2D-Grafik Chart als Image erstellen Allgemeine Java-Themen 3
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
S Compiler-Fehler IntelliJ Projektdatei lässt sich nicht erstellen. Allgemeine Java-Themen 15
M 2D Array mit unterschiedlichen Längen erstellen und befüllen Allgemeine Java-Themen 11
E Swing Buttons auf knopfdruck(anderer Button) erstellen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben