Aquí hay una solución que le permite mover un nodo a cualquier posición en el árbol con solo un único parámetro de entrada:la nueva posición izquierda (newpos) del nodo.
Fundamentalmente hay tres conjuntos:
- Crea un nuevo espacio para el subárbol.
- Mueva el subárbol a este espacio.
- Eliminar el antiguo espacio dejado vacante por el subárbol.
En psuedo-sql, se ve así:
//
* -- 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
*/
La variable :distance es la distancia entre las posiciones nueva y antigua, :width es el tamaño del subárbol y :tmppos se utiliza para realizar un seguimiento del movimiento del subárbol durante las actualizaciones. Estas variables se definen como:
// 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;
}
Para ver un ejemplo de código completo, consulte mi blog en
https://rogerkeays.com/how -para-mover-un-nodo-en-conjuntos-anidados-con-sql
Si le gusta esta solución, vote a favor.