Binärbaum sortiert ausgeben

Status
Nicht offen für weitere Antworten.

lowterm

Mitglied
Hi,

ich stehe vor einem Problem, das ich seit Stunden nicht lösen kann.
Ich muss einen AVL-Baum(Binär) sortiert augeben, wobei möglichst
wenige Knoten der Baumes durchlaufen werden sollen.

Die Sortierung habe ich ganz schnell hinbekommen, wie kann ich aber
dafür sorgen, dass möglichst wenige Knoten der Baumes durchlaufen werden?

Hat jemand da eine Idee. Für jede Hilfe bin ich dankbar.

Danke im Voraus. :bahnhof:
 

lowterm

Mitglied
Hi,

das ist auch der Quelltext, was das ganze sortiert.

Code:
public String sortieren(Knoten einKnoten, String text){
  if(einKnoten.getKnotenLinks() != null && einKnoten.getKnotenLinks().getSchluessel() < rootKey)
      text = sortieren(einKnoten.getKnotenLinks(), text);
  		
    text += einKnoten.getSchluessel() + " " + einKnoten.getBezeichnung() + "\n";

    if(einKnoten.getKnotenRechts() != null)
       text = sortieren(einKnoten.getKnotenRechts(), text);
   
   return text;
 }

Gruß
 

Hilefoks

Bekanntes Mitglied
Wenn du einen binären Baum InOrdner ausgibst, dann ist diese Ausgabe sortiert und jeder Knoten wird nur einmal besucht. Und fast genau das hast du programmiert. Nur deine erste if-Abfrage macht zu viel - aussreichend ist diese:
Code:
if(einKnoten.getKnotenLinks() != null) 
      text=sortieren(einKnoten.getKnotenLinks(), text);

Zudem solltest du den "String text" durch einen StringBuilder oder StringBuffer ersetzen. Mit diesen beiden Änderungen ist dann nicht nur die Anforderung "möglichst wenige Knoten der Baumes durchlaufen" erfüllt (das ist sie schon), sondern dein Code ist dann auch, an dieser Stelle, nahezu perfekt.

MfG,
Hilefoks
 

lowterm

Mitglied
Hi,

vielen Dank für deine Antwort.

Du willst etwa nicht sagen, dass ich gestern stundenlang für nichts meine Zeit vergeuden
habe, obwohl die Lösung schon da war :oops:

Naja, soweit muss auch kommen, dass man vor lauten Bäumen den Wald nicht sehen kann,
wenn man wegen Müdigkeit kaum denken kann.

Ich war nicht so sicher, weil mein Prof. sagte, dass ich noch diese Anfordeung erfüllen muss,
nachdem er meinen Code gesehen hatte. ???:L

Danke nochmals.
 

lowterm

Mitglied
Hi,

es habe da was vergessen.
Es sollte bei der Sortierung nur die Schlüssel auf gelistet werden die zwischen 1000 und 1999
liegen. Daher sollte man doch die Abfrage so gestalten, dass die Knoten links und rechts nicht
unnötig besucht werden, wenn nicht relevant sind. :bahnhof:

Gruß
 

Hilefoks

Bekanntes Mitglied
Das ist auch nicht so schwer... ein AVL-Baum sieht ja immer etwa so aus (von jedem Teilbaum sind alle Einzelwerte des linken kleiner und des rechten grösser als der Wert im aktuellen Knoten):
Code:
       12
     /    \
   4        20
  / \       / \
 1    6   17    30
         /     / \
       13    22   35

InOrder bedeutet das man immer erst links, dann die Wurzel und dann rechts bearbeitet (und zwar rekursiv). Das bedeutet man läuft erst links den Baum herab bis zur 1 und behandelt diesen Knoten dann (gibt also z.B. die 1 aus). Danach behandelt man die Wurzel dieses Knotens (4) und danach den rechten Teilbaum (6). Nun ist der linke Teilbaum der 12 komplett bearbeitet und es wird die 12 behandelt. Danach geht es im rechten Teilbaum weiter (20). Hier steigt man wiederum links bis zum Blatt ab (13), usw. ....

Wenn du nun z.B. alle Zahlen grösser 20 ausgeben möchtest musst du nur schauen ob der aktuelle Knoten grösser (gleich) der kleinsten auszugebenen Zahl ist. Wenn ja gehst du links tiefer, sonst behandelt du den aktuellen Knoten und gehst rechts herunter.

Du brauchst also nur deine ursprüngliche if-Abfrage wieder einbauen (die, die ich für überflüssig gehalten habe) und leicht anpassen.

Hoffe du verstehst was ich meine... ;-)

MfG,
Hilefoks

P.S: Bist du (Informatik)-Student in einem frühen Semester?
 

lowterm

Mitglied
Hi,

danke. Leider alle meiner Versuche, dies mit if-Abfrage abzufangen gescheitert sind.
Da bekomme ich immer irgend welche Werte, die nicht vorkommen müssen. Ich stehe
leider auch etwas unter Druck(Morgen Abgabetermin und Mathe-Klausur) und daher
kaum zurechnungfähig :autsch: . Dr Code sieht jetzt so aus:

Code:
      public String sortieren(Knoten einKnoten, String text){
          if(einKnoten.getKnotenLinks() != null && einKnoten.getSchluessel() >= 1000){
               text = sortieren(einKnoten.getKnotenLinks(), text);
          }

          text += einKnoten.getSchluessel() + " " + einKnoten.getBezeichnung() + "\n";

          if(einKnoten.getKnotenRechts() != null && einKnoten.getSchluessel() <= 1999){
               text = sortieren(einKnoten.getKnotenRechts(), text);
          } 
      }

Gruß[/code]
 
S

SlaterB

Gast
wozu in aller Welt braucht der Mensch Code, wenn nicht selber denken kann?

mache dir erstmal einen Plan, beschreibe in deutscher Schrift was passieren soll,
du prüfst z.B. nur den aktuellen Knoten bei der Weiterführung der Rekursion,
ob aber der linke Knoten < 1000 ist, ist egal, der wird auf jeden Fall ausgegeben..


> Da bekomme ich immer irgend welche Werte, die nicht vorkommen müssen.

analysieren, verstehen, verbessern,
die Reihenfolge ist doch wohl immer noch gegeben, oder?
(die Operation sortiert nicht, sondern sollte sortierteAusgabe oder so heißen)
was läuft falsch?, welche Knoten konkret in welchem Baum,
prüfe den genauen Programmablauf,
warum wurde ein falscher Knoten ausgegeben bzw. ein richtiger nicht,
wie widerspricht der Programmablauf deinem gedachten Ablaufplan
(den du dir erstmal auf Papier erstellen musst)
 

lowterm

Mitglied
Hallo,

ich kann die richtigen Ausgabe erzwingen, indem ich die if-Abfrage direct da setze, wo der String
zusammengebaut wird. Das ist aber nicht der Sinn der Sache, weill es sollte so wenig wie mödlich
die Knotten besucht werden.

Code:
   if(einKnoten.getSchluessel() >= 1000 && einKnoten.getSchluessel() <= 1999)		
      text += einKnoten.getSchluessel() + " " + einKnoten.getBezeichnung() + "\n";

Eigentlich sollte das Ganze so funktionieren, wo ich was falsch mache, finde ich leider nach langer
Suche nicht, daher auch die Frage im Forum.

Gruß
 
S

SlaterB

Gast
quatsch, einmal den Schlüssel auslesen musst du mindestens,
und mit beiden Werten vergleichen auch

es sei denn, du übergibst vom Vaterknoten, dass der Maximalwert gar nicht erreicht werden kann (Vaterknoten 1500, dann ist linkes Kind auf jeden Fall < 1999),
aber das wäre unnötig kompliziert, nicht sinnvoll,

was stört es, den Knoten neben >1000 auch auf <1999 zu prüfen?
das kostet so gut wie keine Zeit,

nervige Aufgabenstellungen, die du wahrscheinlich nur falsch interpretierst, zählen nicht,

viel wichtiger ist für 'nicht mehrmals besuchen', dass du wirklich nichts mehrmals besuchst, also von einem Knotem mehrmals das linke Kind bearbeitest,
das wäre nämlich aufwendig..
 

Hilefoks

Bekanntes Mitglied
So sollte es reichen:
Code:
      public String sortieren(Knoten einKnoten, String text){
          if(einKnoten.getSchluessel() > 1999 || einKnoten.getSchluessel() < 1000)
               return "";

          if(einKnoten.getKnotenLinks() != null)
               text = sortieren(einKnoten.getKnotenLinks(), text);

          text += einKnoten.getSchluessel() + " " + einKnoten.getBezeichnung() + "\n";

          if(einKnoten.getKnotenRechts() != null)
               text = sortieren(einKnoten.getKnotenRechts(), text);
 
         return text;
      }

MfG,
Hilefoks
 
S

SlaterB

Gast
falsch,

schau dir deinen obigen Baum als Beispiel an und nimm als Grenze 5-10,

wenn du dann beim Knoten 4 sofort aufhörst wirst du nie den korrekten Knoten 6 erreichen

---------

es stört hier vielleicht etwas, andererseits passt es wirklich gut:
die ganzen String-Additionen sind sehr inperformant,
besser einen StringBuilder mit append benutzen, das schont den Arbeitsspeicher und geht auch noch viel flotter
(relativ gesehen, auch die langsame Methode dauert nur ein paar Millisekunden, je nach Größe des Baums)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Binärbaum Blätter Allgemeine Java-Themen 10
R0m1lly BinärBaum auf Konsole ausgeben Allgemeine Java-Themen 9
S Binärbaum prüfen Allgemeine Java-Themen 0
L Rekursion Binärbaum Allgemeine Java-Themen 7
0 Binärbaum vervollständigen Allgemeine Java-Themen 0
K Binärbaum - InOrder Traversierung Allgemeine Java-Themen 0
N Binärbaum verstehen Allgemeine Java-Themen 6
J Die Menge einer Zahl im Binärbaum zählen Allgemeine Java-Themen 7
G Suchweg durch Binärbaum speichern Allgemeine Java-Themen 4
G Binärbaum aktualisieren Allgemeine Java-Themen 11
T Wie heißt ein Binärbaum, dessen Knoten immer zwei Kinder haben müssen? Allgemeine Java-Themen 2
M Binärbaum auf vollständigkeit prüfen Allgemeine Java-Themen 4
S Knoten zählen in einem Binärbaum Allgemeine Java-Themen 2
G Binärbaum (PreOrder, InOrder, PostOrder) Allgemeine Java-Themen 6
S Traversierung (Binärbaum) Allgemeine Java-Themen 3
M Binärbaum aus Infix- und Präfixordnung erstellen Allgemeine Java-Themen 5
K traversieren von binärbaum Allgemeine Java-Themen 4
B OOP HashSet sortiert ausgeben Allgemeine Java-Themen 11
G Datentypen TreeMap nach Color sortiert (kd-Baum) Allgemeine Java-Themen 8
P Datentypen Große Datenmenge Sortiert halten Allgemeine Java-Themen 12
_dp Datentypen PriorityQueue sortiert falsch? Allgemeine Java-Themen 6
G File.listFiles nach Datum sortiert ausgeben Allgemeine Java-Themen 1
F (Wie) sortiert ihr eure Felder, Methoden, etc? Allgemeine Java-Themen 19
M HashMap sortiert Allgemeine Java-Themen 6
T HashMap, sortiert nach Reihenfolge Allgemeine Java-Themen 7
m@nu FileTreeModel sortiert . uiuiui Allgemeine Java-Themen 14
E HashMap/Table sortiert nach nacheinander eingefuegten Elmeme Allgemeine Java-Themen 6
kodela StatusBar-Anzeigen auch in Log-Datei ausgeben Allgemeine Java-Themen 3
M Quicksort Rang ausgeben Allgemeine Java-Themen 2
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
BeginnerJava Anzahl der 5 % - Zuwächse ausgeben Allgemeine Java-Themen 6
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
R Sonderzeichen aus Datei einlesen und in Datei ausgeben. Allgemeine Java-Themen 17
el_niiinho13 Objekt auf der Konsole ausgeben lassen Allgemeine Java-Themen 8
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
S Wörterliste nach Wörtern mit u durchsuchen und diese auf der Konsole ausgeben lassen Allgemeine Java-Themen 33
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
M Bei String.format ein Komma statt einem Punkt ausgeben lassen Allgemeine Java-Themen 1
G Excel Datum richtig auf der Konsole ausgeben Allgemeine Java-Themen 1
D Erste Schritte Arrays vergleichen und die zahlen die nur einmal vorkommen ausgeben Allgemeine Java-Themen 5
M Töne mit Java ausgeben Allgemeine Java-Themen 1
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
ralfb1105 Java LogManager property bestimmen/ausgeben Allgemeine Java-Themen 1
R .txt Datei einlesen und auf der Konsole ausgeben lassen Allgemeine Java-Themen 11
B Schlossknacker (Jede mögliche Zahlenkombination ausgeben) Allgemeine Java-Themen 18
heinz ketchup String im JLabel ausgeben und erneuern Allgemeine Java-Themen 6
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
G Array ohne Aufzählungszeichen ausgeben Allgemeine Java-Themen 6
J Wie kann ich ein Java Array als Säulendiagramm ausgeben? Allgemeine Java-Themen 2
G Iteratoren - Wie kann man mithilfe von Iteratoren nur jeden zweiten Wert eines TreeSets ausgeben? Allgemeine Java-Themen 4
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
J Ausgabe von Links nach Rechts ausgeben? Allgemeine Java-Themen 2
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
FunnyO KeyEvent.VK_ + int i, ausgeben mit Bot möglich? Allgemeine Java-Themen 2
L Java-Programm Zahlenkombinationen ausgeben Allgemeine Java-Themen 10
stylegangsta Mehrere html seiten einer Homepage einlesen und als Textdatei ausgeben Allgemeine Java-Themen 14
F Namen des Interfaces ausgeben Allgemeine Java-Themen 1
S 2-spaltige Ausgabe als Tabelle ausgeben Allgemeine Java-Themen 12
M liste von listen anders ausgeben Allgemeine Java-Themen 1
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
F String nach Schlüsselwörtern durchsuchen und ganze Zeile ausgeben Allgemeine Java-Themen 4
C pfad vom Image ausgeben lassen Allgemeine Java-Themen 5
U Koordinaten alle Pixel eines Dreiecks zeichnen ausgeben Allgemeine Java-Themen 5
J String verarbeiten und ausgeben Allgemeine Java-Themen 8
F for-Schleife auf Kommandoebene ausgeben Allgemeine Java-Themen 9
X System.out/err(Die Console) in JTextArea ausgeben Allgemeine Java-Themen 2
B Zahlen ausgeben hilfe! Allgemeine Java-Themen 8
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
R Int werte vergleichen und Anzahl Paare ausgeben Allgemeine Java-Themen 4
D Name eines Nicht-String Objekts ausgeben Allgemeine Java-Themen 4
B Java Mail Client als Outlook ausgeben Allgemeine Java-Themen 2
E Boolean aus Klasse A als String in Klasse B ausgeben Allgemeine Java-Themen 4
H Unicode ausgeben ohne Umwandlung - geht das? Allgemeine Java-Themen 3
J Internettextdatei auslesen und als String ausgeben Allgemeine Java-Themen 2
AssELAss XML Datei einlesen und anschließen formatiert ausgeben in Datei Allgemeine Java-Themen 0
A Datentypen Dateien umbenennen mit Dateiendungen - Dateiendungen ausgeben Allgemeine Java-Themen 2
S String mit Matcher.find durchsuchen und ausgeben Allgemeine Java-Themen 7
A Java Verzeichnisse in Combobox Ausgeben JAVA Allgemeine Java-Themen 3
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
A Selbsterstellte 404-Seiten bestimmen, die sich als 200 ausgeben Allgemeine Java-Themen 8
B Binaräres Format in Dezimalformat umwandeln u. dabei die Zwischenschritte ausgeben Allgemeine Java-Themen 3
M JExcel Wert aus Zelle übergeben/ausgeben Allgemeine Java-Themen 2
M RegEx alle Matches ausgeben Allgemeine Java-Themen 5
A Sinuston ausgeben und über Mikro Amplitude messen – machbar? Allgemeine Java-Themen 6
B TreeSet-Ausgeben Allgemeine Java-Themen 8
P Werte in Array zählen und Summe der einzelnen Teile ausgeben Allgemeine Java-Themen 10
G Jar-File soll eignen *.jar Namen ausgeben Allgemeine Java-Themen 10
N Applet Apache Poi Wert einer Formel ausgeben Allgemeine Java-Themen 5
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
S 2D Vector speziell ausgeben. Allgemeine Java-Themen 2
A einzelne Tage als Datum ausgeben Allgemeine Java-Themen 6
R FileChooser soll nur das File ausgeben Allgemeine Java-Themen 4
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
Semox "Gute" Rückgaben von bash Shell ausgeben Allgemeine Java-Themen 4
E Variable dynamisch ausgeben Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben