Hier ist eine Lösung, mit der Sie einen Knoten mit nur einem einzigen Eingabeparameter an eine beliebige Position im Baum verschieben können - die neue linke Position (newpos) des Knotens.
Grundsätzlich gibt es drei Sätze:
- Neuen Platz für den Teilbaum schaffen.
- Verschieben Sie den Teilbaum in diesen Bereich.
- Entfernen Sie den alten Platz, der durch den Unterbaum freigegeben wurde.
In Psuedo-SQL sieht es so aus:
//
* -- create new space for subtree
* UPDATE tags SET lpos = lpos + :width WHERE lpos >= :newpos
* UPDATE tags SET rpos = rpos + :width WHERE rpos >= :newpos
*
* -- move subtree into new space
* UPDATE tags SET lpos = lpos + :distance, rpos = rpos + :distance
* WHERE lpos >= :tmppos AND rpos < :tmppos + :width
*
* -- remove old space vacated by subtree
* UPDATE tags SET lpos = lpos - :width WHERE lpos > :oldrpos
* UPDATE tags SET rpos = rpos - :width WHERE rpos > :oldrpos
*/
Die Variable :distance ist der Abstand zwischen der neuen und der alten Position, die Variable :width ist die Größe des Unterbaums, und :tmppos wird verwendet, um den Überblick über den Unterbaum zu behalten, der während der Aktualisierungen verschoben wird. Diese Variablen sind wie folgt definiert:
// calculate position adjustment variables
int width = node.getRpos() - node.getLpos() + 1;
int distance = newpos - node.getLpos();
int tmppos = node.getLpos();
// backwards movement must account for new space
if (distance < 0) {
distance -= width;
tmppos += width;
}
Ein vollständiges Codebeispiel finden Sie in meinem Blog unter
https://rogerkeays.com/how -um-einen-knoten-in-verschachtelten-sätzen-mit-sql-zu-bewegen
Wenn Ihnen diese Lösung gefällt, stimmen Sie bitte hoch.