Was für das Verständnis von Rekursion wichtig ist, ist die rekursive Funktion als abstrakte Black Box zu denken. Mit anderen Worten, beim Lesen oder Nachdenken über rekursive Funktionen sollten Sie sich auf die aktuelle Iteration konzentrieren, den Aufruf der rekursiven Funktion als atomar behandeln (etwas, in das Sie nicht hineingehen können), vorausgesetzt, er kann tun, was er tun soll, und sehen, wie sein Ergebnis kann verwendet werden, um die aktuelle Iteration zu lösen.
Sie kennen bereits den Auftrag IhrDeterm TREE-ROOT-INSERT(x, z)
:
Einsatz z in einen binären Suchbaum bei x verwurzelt, verwandelt den Baum, so dass z die neue Wurzel werden wird.
die an diesem Schnipsel sehen lassen:
if z.key < x.key
x.left = TREE-ROOT-INSERT(x.left, z)
return RIGHT-ROTATE(x)
Dies sagt z kleiner als x ist, so dass es auf den linken Unterbaum geht (weil es BST ist). TREE-ROOT-INSERT
wird erneut aufgerufen, aber wir werden nicht darauf eingehen. Stattdessen nehmen wir einfach an, dass es tun kann, was es tun soll: es wird z in den Baum einfügen, der auf x.left verwurzelt ist, und z zum neuen root machen. Dann werden Sie einen Baum des Balgs Struktur erhalten:
x
/\
z ...
/\
... ...
Auch Sie wissen nicht, wie genau TREE-ROOT-INSERT(x.left, z)
Aufruf erhalten Sie die z-verwurzelte Unterbaum. In diesem Moment ist es dir egal, denn der wirklich wichtige Teil ist, was folgt: Wie kann man diesen ganzen Baum in z verankern? Die Antwort ist die RIGHT-ROTATE(x)
Aber in meinem Kopf den Code zu analysieren Ich nehme an, dass er den Knoten einsetzen, wo es zu gehen hat und dann nur 1 Mal ist es der Baum dreht.
Wie ist es möglich, dass der Baum jedes Mal gedreht wird?
Wenn ich Sie richtig verstehe, denken Sie immer noch darüber nach, wie Sie das Problem nicht rekursiv lösen können.Es ist richtig, dass Sie z mit der Standard-BST-Einfügeprozedur in die BST mit der Wurzel x einfügen können. Das bringt z in die richtige Position. Um jedoch z von dieser Position zur Wurzel zu bringen, benötigen Sie mehr als 1 Rotation.
In der rekursiven Version ist eine Rotation erforderlich, um z zum Stamm zu bringen, nachdem Sie einen z-Root-Subbaum erhalten haben. Um jedoch den z-rooted-Subbaum aus dem ursprünglichen x.left-Root-Subbaum zu erhalten, benötigen Sie ebenfalls eine Rotation. Die Rotation wird oft, aber auf verschiedenen Teilbäumen aufgerufen.
Dies könnte ein besseres Beispiel sein http://stackoverflow.com/questions/6323656/multiple-avl-tree-rotation?rq=1 –
Auch dieses Beispiel hier * Einfügung von 15 * schlägt vor, mehr als eine Drehung benötigt werden https://jriera.webs.ull.es/Docencia/avl_handout.pdf –