2.2 Cây k-d (k-d Trees)
2.2.3 Huỷ bỏ trong cây 2-d
Công việc phức tạp nhất với cây 2-d là huỷ bỏ điểm khỏi cây. Giả sử T là cây 2 chiều, điểm sẽ huỷ bỏ có toạ độ (x,y). Bƣớc thứ nhất của việc huỷ bỏ là tìm ra nút N trong T sao cho N.XVAL = x và N.YVAL = y. Nếu N là nút lá thì huỷ N là dễ dàng, chỉ việc đặt NIL cho LLINK,RLINK trong nút cha N, giải phóng vùng nhớ N. Nếu N là nút trong cây thì tình hình phức tạp hơn. Trong trƣờng hợp này, cây con có gốc tại N.LLINK (đặt tên là T1) hay tại N.RLINK ( đặt tên là Tr) là không rỗng. Yêu cầu đặt ra bây giờ là tìm nút R từ T1 hay Tr có thể thay thế nút N và có thể lần
c) d)
lƣợt đƣợc huỷ bỏ khỏi cây con. Nhƣ vậy các bƣớc của thuật toán huỷ bỏ nút N bên trong cây sẽ là:
Bước 1: Tìm nút ứng viên thay thế R trong Ti với i{l,r}.
Bước 2: Thay thế mọi trƣờng không có liên kết của N bởi các trƣờng của R.
Bước 3: Huỷ bỏ đệ qui R khỏi Ti
Đệ qui trên có điểm dừng vì Ti với i {l,r} có độ cao nhỏ hơn cây T.
Bƣớc phức tạp nhất trong thuật toán trên là tìm ra nút ứng viên thay thế. Nút R muốn thay thế phải có quan hệ không gian với mọi nút P trong T1 và Tr sao cho N dẫn tới P. Có nghĩa cho rằng, nếu P ở phía tây nam N thì P phải ở tây nam R, nếu P ở tây bắc N thì P phải ở tây bắc R, …Nhƣ vậy, nút mong muốn thay thế R phải thoả mãn các tính chất sau:
1. Mọi nút M trong T1 thoả M.XVAL < R.XVAL nếu level(N) là chẵn và M.YVAL < R.YVAL nếu level(N) là lẻ.
2. Mọi nút M trong Tr thoả M.XVAL R.XVAL nếu level(N) là chẵn và M.YVALR.YVAL nếu level(N) là lẻ.
Nếu Tr không rỗng và level(N) là chẵn, thì bất kỳ nút nào trong Tr mà có trƣờng XVAL nhỏ nhất thì là nút ứng viên thay thế. Thí dụ, trong hình 2.4e, nếu lấy N là nút chứa Banja Luka, thì nút ứng viên thay thế từ cây con bên phải là nút liên kết với Testic vì nó có toạ độ x nhỏ nhất trong các nút của cây con phía phải Banja Luaka.
Mặt khác, nếu Tr không rỗng và level(N) là lẻ thì bất kỳ nút nào trong Tr mà có trƣờng YVAL nhỏ nhất thì là nút ứng viên thay thế.
Tổng quát thì việc tìm kiếm nút thay thế từ cây con bên trái chỉ có thể thắng lợi dưới một số điều kiện nhất định. Nếu level(N) là chẵn thì nút thay thế phù hợp trong T1 là nút bất kỳ nếu thoả mãn trƣờng XVAL của nó có giá trị lớn nhất. Tƣơng tự nếu level(N) là lẻ thì có thể sử dụng nút bất kỳ trong T1 mà có trƣờng YVAL lớn nhất để làm nút thay thế.
Vấn đề xảy ra là có thể có nhiều nút trong T1 cùng có XVAL (hay YVAL) lớn nhất, trong trƣờng hợp này điều kiện thứ hai trong định nghĩa cây 2-d có thể bị vi
phạm bởi bƣớc 3 vừa mô tả trên. Tổng quát thì, nếu N là nút trong và ta muốn huỷ bỏ N khỏi T thì tìm thay thế từ cây con phải vì việc tìm ứng viên thay thế trong cây trái là không thể.
Cái gì xảy ra nếu N có cây phải rỗng (N.RLINK=NIL)? Trong trƣờng hợp này có thể chọn nút thay thế R từ T1 có giá trị x nhỏ nhất trong T1 (nếu level(N) là chẵn) hay có giá trị y nhỏ nhất trong T1 (nếu level(N) là lẻ). Sau đó, sửa đổi bƣớc 2 trong thuật toán trên đây nhƣ sau:
Bước 2 (sửa đổi): Thay thế toàn bộ các trƣờng không có liên kết của nút N bằng nút R. Đặt N.RLLNK=N.LLINK và N.LLINK=NIL.