Klasse Baum

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ich hab hier mal wieder eine ganz interessante Aufgabe. WÄr ganz nett wenn wir hier ein paar Ideen zusammenbekommen könnten. Weil so ganz alleine krieg ich das wohl nicht hin...Danke schonmal für die Tipps.

    Implementieren Sie eine Klasse BinaerBaum. In den Knoten sollen Zeichenketten verwaltet
    werden können. Folgende Methoden sollen enthalten sein:
    void fuegeEinSortiert(String neu):
    Einfügen einer neuen Zeichenkette in den Baum nach dem Prinzip:
    Falls Neu < Inhalt des Knotens dann in den linken Unterbaum, sonst in den
    rechten Unterbaum.
    void ausgabeLWR(): Ausgabe des Baumes in der Reihenfolge Links-Wurzel-Rechts:
    das führt zu einer aufsteigend sortierten Folge
    void ausgabeRWL(): Ausgabe des Baumes in der Reihenfolge Rechts-Wurzel-Links:
    das führt zu einer absteigend sortierten Folge
    int anzahl(): Ermittelt die Anzahl der Knoten im Baum (rekursiv)
    Nutzen Sie für die Darstellung eines Baumes die Methode ausgabe() (siehe Datei
    baumausgabe.txt) Wie sind die Methoden ausgabeLWR() bzw. ausgabeRWL() zu ändern,
    damit im Ergebnis eine Folge sortierter Zeichenketten entsteht, die auch weiter verarbeitet
    werden kann? (Hinweis: String-Array oder ArrayList)

    a) Entwickeln Sie für die Klasse BinaerBaum eine Methode, die für den Baum die Tiefe
    bestimmt.
    b) Wenn Bäume sehr ungleich sind, versucht man diese mittels Rotationen auszugleichen.
    Machen Sie sich mit den Rotationsoperationen auf Bäumen vertraut und implementieren Sie
    die Methoden rotiereLinks() sowie rotiereRechts():
  • Ich schließe mich mal der Frage bzw. Aufgabe an....

    Würde persönlich erstmal so anfangen.

    Quellcode

    1. class BinBaum // ------------------------------------------------
    2. { BinBaum links; // linker Teilbaum
    3. BinBaum rechts; // rechter Teilbaum
    4. String inhalt; // Inhalt soll String sein.
    5. // Konstruktor
    6. BinBaum (String neu)
    7. { this.links = null;
    8. this.rechts = null;
    9. this.inhalt = neu;
    10. }
    11. void fuegeEinSortiert (String neu)
    12. { if (inhalt == neu)
    13. { // in linken Teilbaum einfuegen
    14. if (links == null)
    15. links = new BinBaum(inhalt);
    16. else links.fuegeEinSortiert(inhalt);
    17. }
    18. else { // in rechten Teilbaum einfuegen
    19. if (rechts == null)
    20. rechts = new BinBaum(inhalt);
    21. else rechts.fuegeEinSortiert(inhalt);
    22. }
    23. } // fuegeEinSortiert
    24. void ausgabeLWR()
    25. {};
    26. void ausgabeRWL()
    27. {};
    28. int anzahl()
    29. {return 6;}
    30. void ausgabe ()
    31. { if (links != null) links.ausgabe();
    32. System.out.print(inhalt); System.out.println();
    33. if (rechts != null) rechts.ausgabe();
    34. } // laufeDurch
    35. } // class BinBaum
    Alles anzeigen


    Wobei das erstmal das Gerüst wäre... Die Methode fuegeEinSortiert ist aber auch noch nicht richtig... Wäre nun auch für weitere Hilfe dankbar.
  • Ich schließe mich mal der Frage bzw. Aufgabe an....

    Würde persönlich erstmal so anfangen.

    Quellcode

    1. class BinBaum // ------------------------------------------------ { BinBaum links; // linker Teilbaum BinBaum rechts; // rechter Teilbaum String inhalt; // Inhalt soll String sein. // Konstruktor BinBaum (String neu) { this.links = null; this.rechts = null; this.inhalt = neu; } void fuegeEinSortiert (String neu) { if (inhalt == neu) { // in linken Teilbaum einfuegen if (links == null) links = new BinBaum(inhalt); else links.fuegeEinSortiert(inhalt); } else { // in rechten Teilbaum einfuegen if (rechts == null) rechts = new BinBaum(inhalt); else rechts.fuegeEinSortiert(inhalt); } } // fuegeEinSortiert void ausgabeLWR() {}; void ausgabeRWL() {}; int anzahl() {return 6;} void ausgabe () { if (links != null) links.ausgabe(); System.out.print(inhalt); System.out.println(); if (rechts != null) rechts.ausgabe(); } // laufeDurch } // class BinBaum



    Wobei das erstmal das Gerüst wäre... Die Methode fuegeEinSortiert ist aber auch noch nicht richtig... Wäre nun auch für weitere Hilfe dankbar.
  • Hey Blane, ich hab grade folgendes gefunden zu der Aufgabe...
    Schauen Sie doch einmal unter Wikipedia und binärem Suchbaum:
    <img src="https://studip.hs-wismar.de/assets/images/link_extern.gif" border="0" />[url]http://de.wikipedia.org/wiki/Bin%C3%A4rer_Suchbaum[/url]
    Dort wird die Rotation erklärt.
    Bei einer Rotation nach rechts passiert folgendes:
    <code>


    A B

    +---+---+ Rotation rechts: +---+---+

    B baum3 ==================> baum1 A

    +---+---+ +---+---+

    baum1 baum2 baum2 baum3


    </code>
    • Der linke Nachfolger der Wurzel wird zum neuen Wurzelknoten
    • Die alte Wurzel(A) wird zum rechten Nachfolger der neuen Wurzel(B)
    • Der alte rechte Unterbaum (b3) der Wurzel(A) bleibt rechter Unterbaum von A
    • Der alte linke Unterbaum (b1) von B bleibt linker Unterbaum von B
    • Der alte rechte Unterbaum(b2) von B wird linker Unterbaum von A
    Kann uns da mal jemand bitte weiterhelfen?
  • Achja und Hier ist der Bauplan der Klasse StringTree zu sehen, der neben den
    Zugriffsmethoden, die Methoden zum Einfügen und zum Ausgeben enthält.
    Die Anwendung dieser Klasse ist der Klasse TestTree zu entnehmen.

    Quellcode

    1. /**
    2. * Ein binärer Suchbaum für Zeichenketten.
    3. *
    4. * Generell können beliebige Objekte in einem Baum verwaltet werden.
    5. * Ein binärer Suchbaum kann nur Objekte verwalten, die vergleichbar
    6. * sind, d.h. auf denen eine Ordnung existiert.
    7. * Programmtechnisch müssen diese Objekte das Interface Comparable
    8. * implementieren.
    9. *
    10. * @author Uwe Lämmel
    11. * @version 04.12.2007
    12. */
    13. public class StringTree {
    14. //-- Bauplan ----------------------------------------------------
    15. String obj; // Inhalt des Knoten
    16. StringTree left; // linker Teilbaum
    17. StringTree right; // rechter Teilbaum
    18. //-- Konstruktor new --------------------------------------------
    19. public StringTree(String x,StringTree l,StringTree r)
    20. { obj=x; left=l; right=r; }
    21. public StringTree(String x) { obj=x; left= right=null;}
    22. public StringTree() { obj=null; left= right=null;}
    23. //-- getLeft,getRight, getRoot ----------------------------------
    24. public StringTree getLeft () { return left; }
    25. public StringTree getRight () { return right; }
    26. public String getObject () { return obj; }
    27. //-- setLeft, setRight, setRoot ---------------------------------
    28. public void setLeft (StringTree l) { left =l; }
    29. public void setRight (StringTree r) { right=r; }
    30. public void setObject(String x) { obj =x; }
    31. //-- Einfügen eines neuen Elementes
    32. public void insert(String x){
    33. // Vergleich ob in den linken oder rechten Unterbaum
    34. if(getObject().compareTo(x)>0){
    35. // Wenn Unterbaum leer, dann neues Element einfügen
    36. if(getLeft()==null) {
    37. // Erzeugen eines neuen Knotens mit x als Inhalt
    38. StringTree st = new StringTree(x);
    39. setLeft(st);
    40. }/if
    41. // Sonst rekursives Einfügen im Unterbaum:
    42. else getLeft().insert(x);
    43. }
    44. else{ // wie links, siehe oben
    45. if(getRight()==null){
    46. // Erzeugen eines neuen Knotens mit x als Inhalt
    47. StringTree st = new StringTree(x);
    48. setRight(st);
    49. }//if
    50. else getRight().insert(x);
    51. }
    52. }//insert
    53. //-- Ausgabe des Baumes in sortierter Reihenfolge
    54. //-- aufsteigend: Links-Wurzel-Rechts
    55. public String ausgabeLWR(){
    56. String s="";
    57. if(getLeft()!=null) s += getLeft().ausgabeLWR();
    58. s += " "+getObject();
    59. if(getRight()!=null) s += getRight().ausgabeLWR();
    60. return s;
    61. }//LWR
    62. //-- ShowBranches -----------------------------------------------
    63. //-- Hilfsmethode zur formatierten Ausgabe auf der Konsole
    64. private void showBranches(int level) {
    65. IntIO io = new IntIO();
    66. if (getRight()!=null) getRight().showBranches(level+1);
    67. for(int i=0; i<level;i++) io.write(" "); io.writeln("+-> "+getObject());
    68. if (getLeft()!=null) getLeft().showBranches(level+1);
    69. }//showBranches
    70. //-- ausgabe ----------------------------------------------------
    71. public void ausgabe() { this.showBranches(0); }
    72. }//StringTree
    Alles anzeigen
    • Man merke sich die Unterbäume von B (BR,BL) sowie den rechten von A (AR).
    • Setzen Sie einen neuen rechten Unterbaum zur Wurzel A: temp
    • Der Knoten temp erhält den Inhalt von A und als rechten Unterbaum AR.
    • Der linke Unterbaum des Knoten temp wird mit BR belegt.
    • Die Wurzel erhält als Inhalt den Inhalt von B, sowie den linken Unterbaum BL.

    Damit ist eine Methode: public void rotateRight(){...} möglich.

    Wir
    rotieren somit nicht den Wurzelknoten selbst sondern verändern seinen
    Inhalt. Im Ergebnis entsteht dann ein Baum, der dem unten stehenden
    Ergebnis entspricht.