Methoden Binärbaum, Traversierung in Array speichern

jan_nick

Neues Mitglied
Guten Abend,

ich habe soeben dieses Forum entdeckt und möchte mich direkt mit einer Frage zur Optimierung meiner bisherigen Lösung an euch wenden:
Es geht um das Ausgeben eines Binären Baumes in richtiger (sortierter) Reihenfolge. Die Baumstruktur ist bereits vorhanden, sprich es geht nicht um das Einfügen oder Umändern der einzelnen Knoten des Binärbaumes, sondern wirklich nur um deren Ausgabe (Inorder). Meine bisherige Lösung funktioniert soweit, jedoch ist diese lediglich nur auf die in der Aufgabe beschriebenen 7 Knoten mit Werten von 1 bis 7 anwendbar und nicht flexibel auf beispielsweise negative Zahlen. Zudem soll die Anzahl der Knoten elegant ohne weitere globale Variablen außerhalb der Klasse ausgegeben werden, was bei mir lediglich mit einer globalen Variable und einem Zähler funktioniert.
Hat jemand Vorschläge zur Optimierung meiner Aufgabe?

Code:
import java.util.Arrays;

public class Aufgabe36 {
   
    /** 
     * Methode binSort wie in der Aufgabenstellung beschrieben
     * 
     * @param node der Wurzelknoten des betrachteten (Teil-)Baums
     * @param a int-array, in dem die Werte der Knoten abgelegt werden sollen (Achtung: Array muss so viele Eintraege haben wie Knoten im Baum sind)
     * @param pos aktuelle Array-Position (0 fuer Aufruf mit der Wurzel des gesamten Baums)
     * @return Anzahl Knoten des Baums
     */
    int knotenanzahl = 0;
   
    public int binSort(BinTreeNode node,int[] a,int pos) {
       
        //System.out.println(pos);
        knotenanzahl++;
       
        pos = node.getValue()-1;
       
        if(node.getLeftChild() != null){

            binSort(node.getLeftChild(), a, pos);

        }
       
        a[pos] = node.getValue();
       
        if(node.getRightChild() != null){

            binSort(node.getRightChild(), a, pos);

        }

            return knotenanzahl;    
    }
   
    /**
     * Main-Methode zum Testen der Methode binSort
     */
    public static void main(String[] args) {
        // Teste Implementierung
        // 1. Erzeuge einfachen Baum
        BinTreeNode root = new BinTreeNode(4);
       
        root.setLeftChild(new BinTreeNode(2));
        root.getLeftChild().setRightChild(new BinTreeNode(3));
        root.getLeftChild().setLeftChild(new BinTreeNode(1));
       
        root.setRightChild(new BinTreeNode(6));
        root.getRightChild().setRightChild(new BinTreeNode(7));
        root.getRightChild().setLeftChild(new BinTreeNode(5));
       
        // 2. Erstelle Array
        int result[] = new int[7];
       
        // 3. Erstelle Aufgabe36-Objekt und rufe binSort(...) auf
        Aufgabe36 myAufgabe = new Aufgabe36();
        int numNodes = myAufgabe.binSort(root, result, 0);
        System.out.println("Anzahl Knoten: " + numNodes);
        System.out.println(Arrays.toString(result));
    }
   
}

public class BinTreeNode {
   
    public BinTreeNode(int value) {
        // setze den Wert des Knotens
        this.value = value;
    }
   
    /* getter und setter */
   
    public BinTreeNode getLeftChild() { return leftChild; }
    public void setLeftChild(BinTreeNode left) { leftChild = left; }
   
    public BinTreeNode getRightChild() { return rightChild; }
    public void setRightChild(BinTreeNode right) { rightChild = right; }
   
    public int getValue() { return value; }
   
    /* member attribute */
    private int value;
    private BinTreeNode leftChild;
    private BinTreeNode rightChild;
   
}
 

mrBrown

Super-Moderator
Mitarbeiter
Ich würde an deiner Stelle mit der Anzahl der Knoten anfangen - das soll sicherlich eine Methode von BinTreeNode sein, und nicht während des Ausgeben passieren.
Als Denkanstoß für die Anzahl: Ein Baum hat doch immer so viele Knoten, wie die Anzahl in den beiden Unter-Knoten plus 1
 

JStein52

Top Contributor
Ich würde an deiner Stelle mit der Anzahl der Knoten anfangen
Ich würde an deiner Stelle mal damit anfangen deine Klasse ein bisschen umzubauen. Bisher funktioniert das ja eigentlich nicht wirklich sondern du stellst durch die richtige Reihenfolge der Code-Zeilen in main sicher dass deine Knoten (natürlich auch nur mit den hart kodierten Werten) an den richtigen Stellen im Baum landen. Wie du richtig erkannt hast ist das nicht besonders "flexibel". Du solltest dir eine einfuegen-Methode machen die einen neuen Wert an die richtige Stelle im Baum einsortiert. Besser wäre sowas:
Code:
public class BinBaum1 {

    BinBaum1 links;   // linker Teilbaum
    BinBaum1 rechts;  // rechter Teilbaum
    int inhalt;      // Inhalt soll int sein.

    // Konstruktor
    BinBaum1(int zahl) {
        this.links = null;
        this.rechts = null;
        this.inhalt = zahl;
    }

    void fuegeEin(int wert) {
        if (wert < inhalt) { // in linken Teilbaum einfuegen
            if (links == null) {
                links = new BinBaum1(wert);
            } else {
                links.fuegeEin(wert);
            }
        } else { // in rechten Teilbaum einfuegen
            if (rechts == null) {
                rechts = new BinBaum1(wert);
            } else {
                rechts.fuegeEin(wert);
            }
        }
    }

    void binSort() {
        if (links != null) {
            links.binSort();
        }
        System.out.print(inhalt);
        System.out.println();
        if (rechts != null) {
            rechts.binSort();
        }
    }
}
Und der nächste Schritt wäre jetzt das Zählen der Knoten. (wie eine main zum testen des ganzen aussehen müsste weisst du sicher ?)
 

JStein52

Top Contributor
Und laut dem nächstem Satz ist es nicht mehr notwendig...
Die nächsten Sätze von ihm sind eigentlich nichtssagend denn er hat ja gar keine Baumstruktur, kein Einfügen usw. Wenn er in seiner main-Methode auch nur zwei Zeilen vertauscht oder 2 Werte verdreht würde sein ganzes schönes binSort nicht mehr funktionieren. Hat er ja selber schon gemerkt.
 

mrBrown

Super-Moderator
Mitarbeiter
Die nächsten Sätze von ihm sind eigentlich nichtssagend denn er hat ja gar keine Baumstruktur, kein Einfügen usw. Wenn er in seiner main-Methode auch nur zwei Zeilen vertauscht oder 2 Werte verdreht würde sein ganzes schönes binSort nicht mehr funktionieren. Hat er ja selber schon gemerkt.
Deshalb: die die genaue und ganze Aufgabenstellung ist nötig.

Eine Baumstruktur hat er natürlich schon - das ist übrigens die Klasse am Ende des Codes - und einfügen kann man da auch - das sind btw die Getter und Setter - ohne könnte er ja kaum den Baum in der main erstellen.
binSort funktioniert sowieso nicht, aus ganz anderen Gründen.
Aber für die Implementierung von binSort, was vom Namen her das sortieren beinhaltet, ist kein sortierter Binärbaum nötig - man kann das auch wunderbar sortiert ausgeben, ohne das der Baum vorher sortiert ist.
 

JStein52

Top Contributor

mrBrown

Super-Moderator
Mitarbeiter
Er hat einen Baum aber keine Baumstruktur.
Ein Baum hat also nicht die Struktur eines Baumes?
Was hat er denn dann, die Struktur einer Ananas?

Und der TE hat das schon besser erkannt als du:
Und weißt du woran das nicht liegt? An dem fehlenden Einfügen des Baums.
Im Gegensatz zu dir hat der TE wenigstens aber auch erkannt, dass es nicht daran liegt, sondern an der binSort. Deren Problem mit negativen Zahlen oder Lücken wird sicherlich nicht behoben, wenn man Werte passend in den Baum einfügen kann...
 

mrBrown

Super-Moderator
Mitarbeiter
Nicht "des Baums" sondern "in den Baum".
Nein, das Einfügen des Baumes ist völlig richtig - es ist die Funktion des Baums.

Na dann viel Spass beim ändern der binSort ... hättest du übrigens schon lang mal tun können. Obwohl ... die Lösung von dir kenne ich eigentlich schon.
Schon dass du sie kennst ;) Aber wenn du mich schon so gut kennst, solltest du ja wissen, dass von mir nicht einfach so fertige Lösungen kommen...

Zeig doch mal deine, die kenn ich noch nicht...
 

JStein52

Top Contributor
Ja klar. Mit voller Absicht. Ich liefere ja keine fertigen Lösungen. den Rest muss der TE machen. Stand auch als Bemerkung am Ende von Post #5 dass der nächste Schritt jetzt das Zählen wäre.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
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
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
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 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
L Indorder Traversierung eines binären Suchbaumes Java Basics - Anfänger-Themen 1
B Baum Traversierung Postorder Java Basics - Anfänger-Themen 6
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben