PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisprobleme: AVL-Baum, Rotationen


mittelding
2011-02-12, 16:24:16
Hallo!

Versuche gerade, Rotationen zur Herstellung eines bilanzierten Baumes zu verstehen. Die Rotationen für sich betrachtet sind nicht das Problem (Links/Rechtsrotation und rechtslinks/linksrechts), das Einfügen in einen Baum auch nicht, nur das Zusammenspiel zwischen Einfügen und Rotieren - wobei man ja sicherlich einem bestimmten Pfad entlang muss - erschließt sich mir nicht.

Aber mal langsam.

Zuerst wird also in den Baum eingefügt. Dass passiert ja ganz normal, entsprechende Position suchen und dann dranhängen - auch wenn dadurch der Baum temporär nicht mehr bilanziert ist.
Und jetzt sollen die Rotationen folgen, die nach dem Einfügen die Balance wiederherstellen. Die richtige Rotationsart bestimmt sich ja durch den Balancewert der einzelnen Knoten. Soweit, so gut.

Doch wo fängt man überhaupt mit dem Rotieren an? Beim Parent des gerade eingefügten Elements (und dann bottom up zur Wurzel) oder aber von der Wurzel und dann nach unten Richtung Blätter?


Ich beziehe mich übrigens auf folgende Rotationsregeln:

Linksrotation, falls Balance des aktuellen Knotens > 1, Rechtsrotation falls Balance des aktuellen Knotens < -1, LinksRechts falls Balance <- 1 und Nachfolgerbalance +1, RechtsLinks falls Balance > 1 und Nachfolgerbalance -1.

Wäre cool, wenn jemand den Ablauf in Worten beschreiben könnte. Also praktisch was passieren muss, nachdem das Einfügen stattgefunden hat. Ich habe noch eine Palette an weiteren Unklarheiten, aber wenn sich obiges Problem löst, so lösen sich vermutlich auch die meisten anderen.

Soweit erstmal, Danke!


Edit: Kann es sein, dass die obigen genannten Regeln wirklich nur für AVL-Bäume brauchbar sind und gewöhnliche, allerdings völlig entartete Binärbaume damit nicht so einfach höhenbilanziert werden können? Denn bei letzteren kann ja z.B. eine Balance von 15 auftreten, da wäre ein einmaliges Rotieren und anschließendes Weiterlaufen zum nächsten Knoten nur einen Tropfen auf den heißen Stein.

Trap
2011-02-12, 16:36:22
Es gilt nur, dass AVL-Baum -> 1 Knoten einfügen -> wenn nötig Rotation wieder zu einem AVL-Baum wird.

Das gilt aber bei allen speziellen Bäumen, die Operationen garantieren nur, dass die Eigenschaft erhalten bleibt, sie sorgen nicht dafür, dass ein beliebiger Baum zu einem XYZ-Baum wird.

mittelding
2011-02-12, 17:21:15
Okay danke schon mal, das hab ich mir gedacht.

Um noch mal zum eigentlichen Anliegen zurückzukommen, ich beschreibe mal wie ich aktuell meine dass es geht und ihr könnt mich ja berichtigen (Einfügen in AVL).

1.) Ich suche im Baum die richtige Einfügeposition, wenn gefunden, dann als Blatt einfügen -> Baum evt. nicht mehr höhenbilanziert.

2.) Jetzt muss vermutlich bottom-up vom eingefügten Knoten bis zur Root durchgelaufen und evt. rotiert werden (?), je nachdem was für ein Balancewert die Knoten bis nach oben aufweisen. Die Rotationen können dabei mit den oben genannten 4 Möglichkeiten passieren (einfache Rotation, oder eben doppelt).

Ist das soweit richtig?

Trap
2011-02-12, 17:25:25
Genau.

mittelding
2011-02-12, 17:46:25
Okay. Dann bleibt noch eine Unklarheit. Die Doppelrotationen beziehen sich ja nicht nur ein einen Knoten, sondern auch auf dessen Kinder, nochmal copy n paste von oben:

Linksrotation, falls Balance des aktuellen Knotens > 1, Rechtsrotation falls Balance des aktuellen Knotens < -1, LinksRechts falls Balance <- 1 und Nachfolgerbalance +1, RechtsLinks falls Balance > 1 und Nachfolgerbalance -1.

Ein Knoten hat aber jedoch möglicherweise 2 Nachfolger, wie ist das "...und Nachfolgerbalance +1..." nun genau zu verstehen? Meine Vermutung ist, dass einer der beiden ignoriert wird, im Falle einer linksrechts-rotation also das linke Kind des Knotens?