Warum habe ich das nicht gleich so gemacht...
Ich habe mir ein kleines Programm gebastelt, das einen AVL-Baum zusammen baut. Bis auf die Funktionen zum Löschen eines Knotens und zum Darstellen/Ausgeben des Baums, scheint alles soweit zu funktionieren.
Hier ist der geschriebene Quellcode:
http://rafb.net/p/1zNXWH89.html Gruß Christian
PS: Vielleicht habe ich auch einen Fehler drinne, denn ob das wirklich Fehlerfrei ist, kann ich nicht sagen. Gut ich habe den Baum getestet und er hat auch immer dann balanciert, wenn er musste, trotzdem bleibt eine kleine Unsicherheit.
EDITAnscheinend ist die Berechnung der balance nach dem rotieren doch nicht richtig
EDIT 2Ich habe den Fehler anscheinend gefunden. Nachdem ich in der funktion zum rotieren nach rechts aus dem Aufruf MAX ein MIN gemacht habe, hat es funktioniert.
Hier der Link:
http://rafb.net/p/lPLs5012.htmlNur einen etwas kuriose Eigenart habe ich noch. Und zwar wird in der funktion zum balancieren geschaut, ob der balance-Wert kleiner -1 oder größer 1 ist.
Gebe ich den balance-Wert aus, so ist dieser 0. Allerdings wird jedes mal die If-Bedingung ausgeführt, ob der balance-Wert jetzt 2, bzw. -2 ist oder nicht. Irgendwas habe ich da übersehen....
EDIT 3Eine kleine Frage habe ich noch. Ich muss ja den Elternknoten des Elternknotens erhöhen, bzw. verringern. Wenn ich aber beim Elternknoten den balance-Wert um 1 erhöht habe, muss ich dann beim Elternknoten des Elternknotens den balance-Wert um 2 erhöhen oder?
Damit dieser wenn ein überhang entsteht entsprechend rotiert. Also anstatt dem ++ im Quellcode ein +=2!
EDIT 4Nachdem ich nun den kompletten bisherigen Code verworfen und neugeschrieben habe funktioniert nun alles. Was jetzt noch fehlt ist die Funktion zum entfernen eines Knotens, aber das werde ich wahrscheinlich auch noch hinbekommen. Wenn interesse besteht, werde ich den Code hochladen und hierher verlinken.