Generischer Binärbaum - löschen

Neele

Mitglied
Hallo,

für eine Hausaufgabe soll ich einen generischen binären Suchbaum erstellen. Das funktioniert auch schon so weit, bloß mit dem Löschen eines Objekts habe ich noch Probleme. Erstmal der Code:
Java:
/**
 * Yet another AVL tree implementation done in Java
 * This one contains recursion to do its job
 *
 * @param <t> java generic wildcard
 */
public class GenericBinaryTree<t extends="" comparable<t="">> {

    /**
     * Das aktuelle T
     */
    private T item;

    /**
     * Der linke Teilbaum
     */
    private GenericBinaryTree<t> left;

    /**
     *Der rechte Teilbaum
     */
    private GenericBinaryTree<t> right;

    /**
     * Konstruktor, erzeugt leere Liste
     */
    public GenericBinaryTree() {
        this.item = null;
        this.left = null;
        this.right = null;
    }

    /**
     * Ueberprueft ob der Baum leer ist
     *
     * @return true, Baum ist leer
     */
    public boolean isEmpty() {
        return this.left == null && this.right == null;
    }

    /**
     * Gibt die Anzahl der Elemente im Baum zurück
     *
     * @return die Groesse
     */
    public int length() {
        if (this.isEmpty()) {
            return 0;
        } else {
            return (this.left.length() + this.right.length() + 1);
        }
    }

    /**
     * Prueft ob ein T in der Liste ist
     *
     * @param x das T
     * @return true, x ist in der Liste enthalten
     */
    public boolean isInList(T x) {
        if (this.isEmpty()) {
            return false;
        } else if (this.item.equals(x)) {
            return true;
        } else {
            return (this.left.isInList(x) || this.right.isInList(x));
        }
    }

    /**
     * Gibt das i-te T der Liste zurueck
     *
     * @param i der Index
     * @return das i-te T
     * @throws IndexOutOfBoundsException wenn i < 0 oder  i >= length()
     */
    public T getItem(int i) throws IndexOutOfBoundsException {
        if (i < 0 || i >= this.length()) {
            throw new IndexOutOfBoundsException();
        } else if (i < this.left.length()) {
            return this.left.getItem(i);
        } else if (i > this.left.length()) {
            return this.right.getItem(i - this.left.length() - 1);
        } else {
            return this.item;
        }
    }

    /**
     * Gets height of tree
     * 
     * @return height
     */
    public int height() {
        if (this.isEmpty()) {
            return 0;
        } else {
            int a = this.left.height();
            int b = this.right.height();
            return a < b ? b + 1 : a + 1;
        }
    }

    /**
     * Fuegt ein Element sortiert in den Baum ein
     *
     * @param x das Element
     * @return der geaenderte Baum
     */
    public GenericBinaryTree<t> insert(T x) {
        if (x.equals(null)) {
            return this;
        }
        if (this.isEmpty()) {
            GenericBinaryTree<t> tmpleft = new GenericBinaryTree<t>();
            GenericBinaryTree<t> tmpright = new GenericBinaryTree<t>();
            this.left = tmpleft;
            this.right = tmpright;
            this.item = x;
            return this;
        } else if (this.item.compareTo(x) <= 0){
            return this.right.insert(x);
        } else {
            return this.left.insert(x);
        }
    }

    /**
     * Loescht das erste vorkommen des Ts x
     *
     * @param x das T
     * @return die geanderte Liste
     */
    public GenericBinaryTree<t> delete(T x) {
        if (!this.isInList(x)){
            return this;
        } else if (this.item.equals(x)) {
            return this.delete();
        } else if (this.item.compareTo(x) <= 0) {
            return this.right.delete(x);
        } else {
            return this.left.delete(x);
        }
    }

    /**
     * Loescht die Wurzel des Baums
     *
     * @return die geanderte Liste
     */
    public GenericBinaryTree<t> delete() {
        if (this.isEmpty()) {
            return this;
        } else if (this.left.isEmpty()) {
            this.item = this.right.item;
            this.left = this.right.left;
            this.right = this.right.right;
            return this;
        } else if (this.right.isEmpty()) {
            this.item = this.left.item;
            this.left = this.left.left;
            this.right = this.left.right;
            return this;
        } else {
            //TODO
            T x = this.right.getItem(0); //this should be copied instead
            this.left.delete(x);
            this.item = x;
            return this;
        }
    }

    /**
     *macht aus der Liste nen kurzen String
     *(gezählte Elemente)
     *
     *@return String
     */
    public String toShortString() {
        String s = "";
        int k = 0;
        if (this.isEmpty()) {
            s = "-empty- \n";
        } else {
            int j = 1; 
            for (int i = 0; i < this.length(); i++) {
                if (i + 1 < this.length() && this.getItem(i).equals(this.getItem(i + 1))) {
                    j++;
                } else {
                    s = s + k + " - " + this.getItem(i).toString() + " (" + j + "x)\n";
                    j = 1;
                    k++;
                }
            }
        }
        return s;
    };


    public String toString2(String str) {
    
        String newstr = str + " -> " + this.item + "\n";
        
        if (this.left != null) {
            newstr += this.left.toString2(str + "l");
        }

        if (this.right != null) {
            newstr += this.right.toString2(str + "r");
        }

        return newstr;
    }

    /**
     *macht aus der Liste nen String
     *
     *@return String
     */
    public String toString() {
        String s = "";
        if (this.isEmpty()) {
            System.out.print( "-empty- \n");
        } else {
            for (int i = 0; i < this.length(); i++) {
                System.out.print(s + i + " - " + this.getItem(i).toString() + "\n");
            }
        }
        return s;
    }


    /**
     * main method for testing purposes
     *
     * @param args commandline arguments
     */
    public static void main(String[] args) {
        GenericBinaryTree<quest> l = new GenericBinaryTree<quest>();

        int[] a = {3, 2, 0, 1, 5, 4, 6};
        int citm = a.length;
        Quest[] itm = new Quest[citm];
        
        System.out.println("Empty: (true) " + l.isEmpty());
        System.out.println("Height: (0) " + l.height());
        System.out.println("Length: (0) " + l.length());

        System.out.println("Items to add...");
        for (int i = 0; i < citm; i++) {
            itm[i] = new Quest("Quest " + a[i], "Prequest " + i, "Item " + i, i+2);
            //itm[i].setName("Item No. " + ((int) (Math.random() * 100)) );
            System.out.println(i + ". " + itm[i]);
        }
        
        
        System.out.println("\nList stuff...");

        for (int i = 0; i < citm; i++) {
            l.insert(itm[i]);
            System.out.println("length: " + l.length());
            System.out.println(l);
        }


        System.out.println("== GET FIRST ITEM");
        System.out.println(l.getItem(0));


        System.out.println("== GET ITEM BY INDEX");
        for (int i = 0; i < citm; i++) {
            System.out.println("getItem(" + i + ") -> " + l.getItem(i));
        }

        System.out.println(l.toString2(""));

        System.out.println("== DELETE FIRST");
        l.delete();
        System.out.println("deleted");
        System.out.println(l);

        System.out.println(l.toString2(""));

        System.out.println("== CHECK IF IN LIST");
        for (int i = 0; i < citm; i++) {
            if (l.isInList(itm[i])) {
                System.out.println("  found   \"" + itm[i] + "\"");
            } else {
                System.out.println("not found \"" + itm[i] + "\"");
            }
        }

        System.out.println("== DELETE ALL");
        for (int i = 0; i < citm; i++) {
            System.out.println("delete(" + itm[i] + ")");
            l.delete(itm[i]);
            System.out.println("deleted");
            System.out.println(l);
        }

        System.out.println("== END OF TEST");
    }
}

Könnt ihr mir helfen a) das Element in Zeile 167 tatsächlich zu kopieren und
<s>b) herauszufinden, woher die NullPointerException kommt, die zurzeit geworfen wird?</s>

Edit zu b): Ich verstehe, woher die Exception kommt: dadurch, dass ich die Wurzel des Baumes verändere, verändert sich auch der Teilbaum, der eigentlich leer sein sollte - und ein nicht-leerer Knoten, dessen Kinder null sind, führt zu NullPointerExceptions :)

Vielen Dank im Vorraus!
Neele</quest></quest></t></t></t></t></t></t></t></t></t></t></t>
 
Zuletzt bearbeitet:

Neele

Mitglied
Inzwischen habe ich, mit der Hilfe eines Kumpels, eine Lösung gefunden. Die delete()-Methode (ehemals Zeile 152-170) sieht jetzt so aus:
Java:
    /**
     * Loescht die Wurzel des Baums
     *
     * @return die geanderte Liste
     */
    public GenericBinaryTree<T> delete() {
        if (this.isEmpty()) {
            return this;
        } else if (this.left.isEmpty()) {
            this.item = this.right.item;
            this.left = this.right.left;
            this.right = this.right.right;
            return this;
        } else if (this.right.isEmpty()) {
            this.item = this.left.item;
            this.right = this.left.right;
            this.left = this.left.left;
            return this;
        } else {
            T x = this.right.getItem(0).clone(); 
            this.right.delete(this.right.getItem(0));
            this.item = x;
            return this;
        }
    }

Damit ist das kopier-Problem gelößt. Um sicherzustellen, dass die Methode clone() auch im Datentypen vorhanden ist, hat sich Zeile 7 geändert:
Java:
public class GenericBinaryTree<T extends Secret<T>> implements List<T> {

und das interface Secret sieht so aus:
Java:
public interface Secret<T> extends Comparable<T> {
    T clone();    
}

So einfach kann es sein! Für Verbesserungsvorschläge bin ich natürlich offen.

Liebe Grüße, Neele
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
G generischer binärbaum Java Basics - Anfänger-Themen 9
S Generischer Bubblesort Java Basics - Anfänger-Themen 19
M Generischer Array erstellen Java Basics - Anfänger-Themen 2
N Enum als generischer Typ Java Basics - Anfänger-Themen 4
S Frage zu generischer Liste Java Basics - Anfänger-Themen 3
P Liste sortieren verschiedener generischer Typen Java Basics - Anfänger-Themen 4
S ClassCastException bei generischer Klasse Java Basics - Anfänger-Themen 5
M Collections Iterator und generischer Baum Java Basics - Anfänger-Themen 0
C Anwendung generischer Typparamter auf ArrayList Java Basics - Anfänger-Themen 2
J Generischer Typ - Array Java Basics - Anfänger-Themen 9
T Generisches Feld in nicht-generischer Klasse möglich? Java Basics - Anfänger-Themen 5
Helgon Polymorphie Generischer Methodenkopf - Erklärung Java Basics - Anfänger-Themen 3
E Generischer Methode ein Array übergeben Java Basics - Anfänger-Themen 3
J Frage zu generischer Klasse und Casten Java Basics - Anfänger-Themen 14
S generischer swap Java Basics - Anfänger-Themen 22
O Kleines Problem mit Konstruktor mit Parametern aus generischer Klasse...oder so ;) Java Basics - Anfänger-Themen 2
D Generischer Datentyp Java Basics - Anfänger-Themen 2
F (Generischer) Adapter Java Basics - Anfänger-Themen 8
T Generics: Generischer Konstruktor-Aufruf? Java Basics - Anfänger-Themen 17
S Frage zu generischer ArrayList Java Basics - Anfänger-Themen 6
X Rekursion & Generischer Datentyp Java Basics - Anfänger-Themen 11
G Subtyp in generischer Klasse Java Basics - Anfänger-Themen 7
E Generischer Datentyp und Arrays Java Basics - Anfänger-Themen 3
T generischer stack Java Basics - Anfänger-Themen 3
ven000m Unterschied zwischen: ADT & generischer Programmierung Java Basics - Anfänger-Themen 2
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
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
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
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 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 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 Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
G Binärbaum grafisch darstellen Java Basics - Anfänger-Themen 4
H Leere Zeilen in Textdatei löschen lassen Java Basics - Anfänger-Themen 5
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
K Wie kann ich "enter" von der Console in Eclipse löschen? Java Basics - Anfänger-Themen 2
E Objekte löschen Java Basics - Anfänger-Themen 9
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
berserkerdq2 Überprüfen ob eine Schreibberechtigung auf ein file exisitert bzw. ob man dieses file löschen kann, wie? Java Basics - Anfänger-Themen 9
J Zelleninhalt einer Jtable löschen Java Basics - Anfänger-Themen 2
G Bitte meinen Account löschen Java Basics - Anfänger-Themen 1
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
W Beitrag löschen Java Basics - Anfänger-Themen 1
O Doppelt verkette Liste Element löschen Java Basics - Anfänger-Themen 15
B Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen? Java Basics - Anfänger-Themen 70

Ähnliche Java Themen

Neue Themen


Oben