Oto rozwiązanie, które pozwala przenieść węzeł do dowolnej pozycji w drzewie za pomocą tylko jednego parametru wejściowego - nowej lewej pozycji (newpos) węzła.
Zasadniczo istnieją trzy zestawy:
- Utwórz nową przestrzeń dla poddrzewa.
- Przenieś poddrzewo w to miejsce.
- Usuń starą przestrzeń zwolnioną przez poddrzewo.
W pseudo-sql wygląda to tak:
//
* -- 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
*/
Zmienna :distance to odległość między nową i starą pozycją, :width to rozmiar poddrzewa, a :tmppos służy do śledzenia przemieszczania poddrzewa podczas aktualizacji. Te zmienne są zdefiniowane jako:
// 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;
}
Pełny przykład kodu można znaleźć na moim blogu pod adresem
https://rogerkeays.com/how -przenieść-węzeł-w-zagnieżdżonych-zestawach-z-SQL
Jeśli podoba Ci się to rozwiązanie, zagłosuj na górę.