BinärBaum einfügen

ocsme

Top Contributor
Guten Tag,
ich hab ein Problem mit einer Übungsaufgabe :(
Aufgabenstellung:
Es soll eine Klasse BinTree mit einer inneren Klasse Node erstellt werden. Dazu noch eine Klasse Element die Comparable<Element> implementiert.
Nun soll eine insert Methode in BinTree geschrieben werden nach folgendem muster. public boolean insert(Element e) anhand der compareTo Methode sollen die Elemente links oder rechts im Baum landen. Bei Gleichheit soll false zurück kommen.

Das ganze habe ich bis jetzt so gemacht:
Java:
public class BinTree {
    protected Node root = null;
    
    protected class Node {
        Element value;
        Node left, right;
        
        Node(Element value, Node left, Node right){
            this.value = value;
            this.left = left;
            this.right = right;
        }
        
        public String toString() {
            return value.toString();
        }
        
        public boolean isEmpty() {
            if(root == null)
                return true;
            return false;
        }
        
        public void inorder(Node n) {
            if (n.left != null) inorder(n.left);
            System.out.println(n.toString());
            if (n.right != null) inorder(n.right);
        }
        
        public boolean insert(Element e) {
            if(root == null) {
                root = new Node(e,null,null);
                return true;
            }
            return false;           
        }
        
    }
    
    class Element implements Comparable<Element> {
        private int value;
        
        Element(int value) {
            this.value = value;
        }
        
        public int compareTo(Element e) {
            if(getValue() > e.getValue())
                return 1;
            if(getValue() < e.getValue())
                return -1;
            return 0;
        }
        
        public String toString() {
            return ""+getValue();
        }
        
        public int getValue() {
            return value;
        }
        
    }

}

Mein Problem ist nun die insert Methode.
Der erste Ansatz war rekursiv über 2 Methoden (Schematisch so)
Java:
void rekFuegeEin  ( Knoten  ast ,i n twert ) {
    if( wert<ast.inhalt ) {
        if(ast.links ==null)
            ast.links =newKnoten(wert);
        else rekFuegeEin (ast.links,wert);
        }
    else {
        if(ast.rechts==null)
            ast.rechts=newKnoten(wert);
        else rekFuegeEin(ast.rechts,wert);
        }
    }

void fuegeEin(int wert) {
    if(wurzel==null)
        wurzel=newKnoten(wert);
    else rekFuegeEin( wurzel,wert);
    }

Das geht nur leider nicht da insert einen boolean zurück gibt.
Rekursiv klappt so also nicht an dieser Stelle.
Doch Interativ bekomme ich es nicht hin. kann mir da jemand einen Tipp geben?

LG
 

ocsme

Top Contributor
Also rekursiv stehe ich leider noch auf dem Schlauch.
Iterativ sollte das ganze ca. so aussehen :D
hab es noch nicht getestet :D

Java:
public boolean insert(Element e) {
            if(root == null) {
                root = new Node(e,null,null);
                return true;
            }
            else {
                Node h = root;
                boolean t = false;
                while(!t) {
                    if(h.value.compareTo(e) == 1)
                        if(h.right==null) {
                            h = new Node(e,null,null);
                            t = true;
                        }
                        else h = h.right;
                    else
                        if(h.value.compareTo(e) == -1)
                            if(h.left == null) {
                                h = new Node(e,null,null);
                                t = true;
                            }
                            else h = h.left;
                }
                   
            }
            return false;          
        }

War nur mal "schnell" hin getextet :p doch rekursiv verursacht bei mir noch "Hirnkurzschluss" :D
Vielleicht komme ich ja noch dahinter :)


Bei der Rekusivion verstehe ich nicht wie soll ich den den ganzen Baum durchwandern ohne den Teilast mit zu geben?
Benötige ich eine zweite Methode? Wenn ja wie soll ich dann ein Boolean zurück geben?

LG
 

Blender3D

Top Contributor
Es soll eine Klasse BinTree mit einer inneren Klasse Node erstellt werden. Dazu noch eine Klasse Element die Comparable<Element> implementiert.
Das hast Du meiner Meinung nach falsch gemacht.
Die Klasse Element soll keine Innere Klasse sein. Der BinTree selbst soll laut Aufgabestellung mit Objekte arbeiten, die das Interface Comparable<T> implementieren. Die Klasse Element soll eine eigenständige Klasse sein die das Interface implementiert, um den BinTree zu testen. Andernfalls würde der BinTree nur mit der Klasse Element funktionieren.
 

ocsme

Top Contributor
Mhhh... das macht Sinn :)
Das muss ich also auch noch ändern.
Ich verstehe nur einfach nicht wie ich das ganze Rekursiv machen könnte mit public boolean insert(Element e), dort kann ich ja die weiteren Referenzen nicht mit angeben. Dachte mir auch schon ich nehm mir eine Hilfsvariable doch die würde bei jedem rekursiven Methoden aufruf ja wieder z. B. auf root stehen :(

Wenn nicht dann mach ich es erst einmal lauffähig ohne Rekursion. Doch bei den Datenstrukturen und vor allem bei den Bäumen finde ich das mit der Rekusion einfach netter :)

Danke erstmal an euch für eure Nette Hilfe :) War länger nicht mehr da :(
 

httpdigest

Top Contributor
Du musst bei der Rekursion keine weiteren Referenzen mit angeben. Du hast doch immer `this`, welches bei einem rekursiven Aufruf ja dann der nächste tiefere Knoten im Braum wäre/ist. Du rufst ja schließlich die Methode rekursiv auf dem nächsten Kindknoten auf. Somit bist du dann auch im Kontext dieses Kindknotens.
 

ocsme

Top Contributor
Es klappt leider immer noch nicht.

Hier mal meine Zwei java Dateien:
Java:
public class BinTree {
    protected Node root = null;
   
   
    protected class Node {
        Element value;
        Node left, right;
       
        Node(Element value, Node left, Node right){
            this.value = value;
            this.left = left;
            this.right = right;
        //    root = this;
        }
       
        public String toString() {
            return value.toString();
        }
       
        public boolean isEmpty() {
            return root==null;
        }
       
        public void inorder(Node n) {
            if (n.left != null)
                inorder(n.left);
            System.out.println(n.toString());
            if (n.right != null)
                inorder(n.right);
        }

        public boolean insert(Element e) {
            if(isEmpty()) {
                root = new Node(e,null,null);
                return true;
            }
            else {
                boolean insert = false;
                Node h = root;
                while(!insert) {
                    if(h.value.compareTo(e) < 0) {
                        if(h.left == null) {
                            h.left = new Node(e,null,null);
                            return true;
                        }
                        else h = h.left;
                    }
                        if(h.right == null) {
                            h.right = new Node(e,null,null);
                            return true;
                        }
                        else h = h.right;
                }  
            }
            return false;
        }
       
    }
}


Java:
class Element implements Comparable<Element> {
    private int value;
   
    Element(int value) {
        this.value = value;
    }
   
    public int compareTo(Element e) {
        if (this.value == e.value)
            return 0;
        return this.value <= e.value ? -1 : 1;
    }

   
    public String toString() {
        return ""+getValue();
    }
   
    public int getValue() {
        return value;
    }
   
}


Das Problem ist das ich mit der inneren und äußeren Klasse auch nicht zurecht komme.
Wie kann ich denn dem root Knoten oben sagen das h dann links oder rechts eingefügt werden soll?
Hab es im Konstruktor auskommentiert denn das stimmt auch nicht wenn ich jedesmal den new Node auf root setze. Doch dann bekomme ich wenigstens meine Knoten bei inorder wieder raus.
So wie es jetzt ist bekomme ich nur den root Knoten ausgegeben der rest Fehlt einfach :(

Hier die Main mit ausgabe:
Java:
public class TestBinTree {
   
    public static void main(String[] args) {
       
        Element e1 = new Element(12);
        Element e2 = new Element (3);
        Element e3 = new Element(15);
       
        BinTree bt = new BinTree();
        BinTree.Node test = new BinTree().new Node(e1,null,null);
        System.out.println(test.insert(e2));
        System.out.println(test.insert(e3));


        System.out.println("inorder");
        test.inorder(test);
       

    }

}

true
true
inorder
12


Kann mir das vielleicht jemand erklären?
Er fügt angeblich ein doch hängt den Zeiger nicht dorthin wo er hin soll.
Wenn man test.left.toString() aufruft bekommt man eine null-Pointer!
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Deine Baumstruktur ist immer noch komplett schräg designed... Erstmal, wie @Blender3D ja schon sagte, soll Element KEINE innere Klasse sein! Es kann ein Typparameter (Generics) sein.
Desweiteren ist es total umständlich, dass Benutzer dieses Baumes die innere Node Klasse sehen und verwenden müssen. Kapsel diese besser weg. Findest du es nicht umständlich, dass du in deinem Test sowohl einen BinTree als auch einen initialen BinTree.Node erzeugen musst?
Ich würde alle Methoden, die man auf einem Baum aufrufen kann, wie etwa insert() und inorder(), auch in der Klasse des Baumes selbst (BinTree) implementieren und im Falle eines nicht-null root dann entsprechend an den Root Node delegieren. Das heißt, die eigentliche Musik spielt dann schon noch in der Node Klasse und deren Methoden, aber die Schnittstelle nach außen sind die Methoden im BinTree.
 

ocsme

Top Contributor
Das verstehe ich ja alles und danke für die Tipps doch leider ist es uns so vorgegeben worden :(

Das Problem ist eben das ich alles in der Klasse Node zuweise und die Informtion nicht an das Datenelement des Baumes / root geht :( Ich verstehe nicht wie ich das tun soll.

Wenn das keine vorgaben wären hätte ich es so gemacht wie du geschrieben hast :) Doch leider dürfen wir das nicht.
Habe auch jetzt verstanden wieso wir das nicht dürfen :D denke das soll eine Übung sein zu Outer.inner Classes :p
Ich sitze hier nur leider schon eine Ewigkeit dran und bekomme es nicht hin.
3DBlender hat mir gut auf die Sprünge geholfen das ganze rekursiv zu machen. Das ganze habe ich auch verstanden doch auch dort habe ich das selbe Problem das die Information in der inner Class bleibt :(

Danke trozdem für eure mühe :)

LG
 

httpdigest

Top Contributor
Doch leider dürfen wir das nicht. Habe auch jetzt verstanden wieso wir das nicht dürfen :D denke das soll eine Übung sein zu Outer.inner Classes :p
Ich verstehe nicht, warum das ein Widerspruch sein soll. Du hast doch dann immer noch eine äußere und eine innere Klasse: BinTree ist die äußere Klasse und Node ist die innere. Ich sehe keinen Grund (und glaube auch nicht, dass das in der Aufgabe so stand), dass Element auch noch eine weitere Klasse sein soll, die bei dir ja auch nur ein int aufnehmen kann.
Wie lautet denn ganz exakt überhaupt die Aufgabe und was ist ganz ganz exakt unveränderlich so vorgegeben?
 

ocsme

Top Contributor
Aufgabenstellung:
Aufgabe 2:
Gegeben ist eine Klasse BinTree zur Repräsentation binärer Bäume:

Java:
class BinTree {

protected Node root = null;

protected class Node {

Element value;

Node left, right;

Node(Element value, Node left, Node right) { ... }

public String toString() { ... }

}

public boolean isEmpty() { ... }

public void inorder( Node n ) { ... }

}

class Element implements Comparable<Element> {

private int value;

Element(int value) { ... }

public int compareTo(Element e) { ... }

public String toString() { ... }

public int getValue() { ... }

}

Implementieren Sie eine Methode public boolean insert(Element e) , die Elemente
in den Baum einfügt.
Eine Instanz e1 der Klasse Element wird als neuer Knoten im linken Teilbaum eines
bestehenden Knotens, welcher eine Instanz e2 der Klasse Element beinhaltet,
eingefügt, wenn e1.getValue() < e2.getValue() .
Im Falle von e1.getValue() > e2.getValue() wird das Element e1 im rechten
Teilbaum eingefügt. Herrscht Gleichheit, so soll die Funktion false zurückliefern.
Benutzen Sie für Ihre Implementierung das vorstehende Codefragment als
Grundlage. Testen Sie Ihr Programm in dem Sie die Werte 4, 2, 6, 8, 9, 7, 5, 3 und 1
in den Baum einfügen und danach für dessen Wurzel die Methode inorder(...)
aufrufen.
 

temi

Top Contributor
Meiner Ansicht nach sollte deine main() ungefähr so aussehen:

Code:
public class TestBinTree {
  
    public static void main(String[] args) {
      
        Element e1 = new Element(12);
        Element e2 = new Element (3);
        Element e3 = new Element(15);
      
        BinTree bt = new BinTree();
        bt.insert(e1);
        bt.insert(e2);       
        bt.insert(e3);

        // ...
    }

}
 

ocsme

Top Contributor
OMG!!!
Augen auf :D ja klar!
so geht es jetzt auch! :p

Jetzt könnte ich aber echt abkotzen ich sitze an dem "misst" jetzt schon 3 Tage immer ein paar Stunden :(

Danke

LG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
D Binärbaum Blätter finden und Ausgeben Java Basics - Anfänger-Themen 22
E Erste Schritte Testklasse Binärbaum Java Basics - Anfänger-Themen 10
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
A Größten Eintrag aus Binärbaum löschen Java Basics - Anfänger-Themen 4
L Ganzen BinärBaum ausgeben? Java Basics - Anfänger-Themen 3
L Binärbaum (Stammbaum) Java Basics - Anfänger-Themen 8
S Binärbaum in PreOrder in ArrayList speichern Java Basics - Anfänger-Themen 0
J Methoden Binärbaum, Traversierung in Array speichern Java Basics - Anfänger-Themen 18
K BinärBaum Java Basics - Anfänger-Themen 4
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
C Binärbaum mit grafischer Ausgabe Java Basics - Anfänger-Themen 0
J Binärbaum formatiert ausgeben. Java Basics - Anfänger-Themen 7
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
N Generischer Binärbaum - löschen Java Basics - Anfänger-Themen 1
M Binärbaum mit parent-Zeigern Java Basics - Anfänger-Themen 1
B Methoden BinärBaum als String Knoten löschen Java Basics - Anfänger-Themen 5
S Binärbaum kopieren Java Basics - Anfänger-Themen 6
B Binärbaum mit java implementieren! Java Basics - Anfänger-Themen 5
D Binärbaum Suche Java Basics - Anfänger-Themen 5
D Binärbaum probleme Java Basics - Anfänger-Themen 4
P Binärbaum - Primärschlüssel Java Basics - Anfänger-Themen 3
X Fehler Binärbaum Java Basics - Anfänger-Themen 6
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
P Binärbaum Ordnungsproblem Java Basics - Anfänger-Themen 8
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
P einen binärbaum implementieren Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B Binärbaum höhe herausfinden Java Basics - Anfänger-Themen 12
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
S Klassen Aufgabe: Binärbaum überprüfen Java Basics - Anfänger-Themen 16
S Binärbaum Java Basics - Anfänger-Themen 9
S Variable Parameterliste in Binärbaum Java Basics - Anfänger-Themen 2
N BinärBaum Hilfestellung Java Basics - Anfänger-Themen 8
S Binärbaum prüfen, ob sortiert oder unsortiert Java Basics - Anfänger-Themen 6
W Binärbaum zahlen addieren Java Basics - Anfänger-Themen 7
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
S Binärbaum Java Basics - Anfänger-Themen 7
I Binärbaum Java Basics - Anfänger-Themen 5
S Bitte um Hilfe beim unsortierten Binärbaum!! Java Basics - Anfänger-Themen 6
J Binärbaum getSize Java Basics - Anfänger-Themen 4
P Fragen zum Binärbaum Java Basics - Anfänger-Themen 3
S Binärbaum implementieren Java Basics - Anfänger-Themen 6
K Tiefe im Binärbaum Java Basics - Anfänger-Themen 2
G generischer binärbaum Java Basics - Anfänger-Themen 9
G Binärbaum und Wrapperklassen Java Basics - Anfänger-Themen 6
F Binärbaum codieren. Codeproblem! Java Basics - Anfänger-Themen 4
D rekursion im binärbaum Java Basics - Anfänger-Themen 11
0 Binärbaum als verkettete Liste Java Basics - Anfänger-Themen 3
T Binärbaum - noch ein "klitzekleiner Fehler" Java Basics - Anfänger-Themen 4
B Binärbaum auf Vollständigkeit prüfen Java Basics - Anfänger-Themen 15
G Binärbaum grafisch darstellen Java Basics - Anfänger-Themen 4
Hilde22 Neu Start JButton einfügen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
melaniemueller setCharAt Leerzeichen zusätzlich einfügen Java Basics - Anfänger-Themen 8
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
E In Array Werte einfügen? Java Basics - Anfänger-Themen 5
districon Element in Liste einfügen Java Basics - Anfänger-Themen 1
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
Gaudimagspam Attribute einfügen private Java Basics - Anfänger-Themen 3
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
R Inventar und Items auf ein 2D ArrayFeld einfügen Java Basics - Anfänger-Themen 2
S Bild einfügen // NEU Java Basics - Anfänger-Themen 12
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
V_Fynn03 Erste Schritte Einen Wert in ein TextField einfügen aus einer anderen Klasse Java Basics - Anfänger-Themen 3
E Datentypen Einfügen von Objekten in eine Map Java Basics - Anfänger-Themen 2
O Naives links rechts einfügen in ADT Baum Java Basics - Anfänger-Themen 8
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
M Klasse in JTable einfügen Java Basics - Anfänger-Themen 7
J In einer Klasse ein AlertDialog einfügen Java Basics - Anfänger-Themen 4
S Elemente in Liste einfügen Java Basics - Anfänger-Themen 2
S Interface (WindowBuilder) Panels in einen Frame einfügen Java Basics - Anfänger-Themen 10
x-tshainge Java Bilder einfügen Java Basics - Anfänger-Themen 1
T Variablen “ in String einfügen Java Basics - Anfänger-Themen 1
Orkanson Objekte in ein Array einfügen Java Basics - Anfänger-Themen 5
S Doppelte Liste Einfügen Java Basics - Anfänger-Themen 1
X Objekte in ArrayList einfügen Java Basics - Anfänger-Themen 10
jaleda100 JTextArea Zeile einfügen Java Basics - Anfänger-Themen 1
R Spielfeldbegrenzung einfügen (Java)? Brauche Hilfe! Java Basics - Anfänger-Themen 15
D B-Baum einfügen und löschen Java Basics - Anfänger-Themen 2
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
JavaNewbie2.0 Tausende Wörter in Arrays automatisch einfügen Java Basics - Anfänger-Themen 10
J Wie kann ich Images per Tastendruck anzeigen/einfügen? Java Basics - Anfänger-Themen 3
F In LinkedList einen Wert ersetzen oder neu einfügen Java Basics - Anfänger-Themen 7
C Verkettete Liste - sortiert einfügen Java Basics - Anfänger-Themen 7
J Scroll-Leiste einfügen Java Basics - Anfänger-Themen 12
U Sound einfügen Java Basics - Anfänger-Themen 6
P String zerstückeln und in Excel einfügen Java Basics - Anfänger-Themen 11
J Objecte in TreeSet einfügen klappt nicht Java Basics - Anfänger-Themen 5
P Variablen Wie kann ich eine lokale Variable in eine andere Methode einfügen? Java Basics - Anfänger-Themen 27
S Bild einfügen Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben