Đây là một giải pháp cho phép bạn di chuyển một nút đến bất kỳ vị trí nào trong cây chỉ với một tham số đầu vào duy nhất - vị trí bên trái mới (newpos) của nút.
Về cơ bản có ba nhóm:
- Tạo không gian mới cho cây con.
- Di chuyển cây con vào không gian này.
- Xóa không gian cũ bị bỏ trống bởi cây con.
Trong psuedo-sql, nó trông như thế này:
//
* -- 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
*/
Biến:distance là khoảng cách giữa các vị trí mới và cũ,:width là kích thước của cây con và:tmppos được sử dụng để theo dõi cây con được di chuyển trong quá trình cập nhật. Các biến này được định nghĩa là:
// 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;
}
Để có ví dụ về mã hoàn chỉnh, hãy xem blog của tôi tại
https://rogerkeays.com/how -to-move-a-node-in-nested-sets-with-sql
Nếu bạn thích giải pháp này, vui lòng bỏ phiếu.