Một cây tứ phân điểm giống nhƣ cây 2-d, đƣợc sử dụng để biểu diễn các điểm dữ liệu trong không gian hai chiều. Có điều không giống nhƣ cây 2-d là cây tứ phân điểm luôn chia một vùng thành 4 phần. Trong cây 2-d, nút N phân một vùng thành hai phần do vẽ một đƣờng thẳng đi qua điểm (N.XVAL, N.YVAL). Đƣờng kẻ này có thể là đƣờng nằm ngang nếu cấp của N là lẻ hoặc là đƣờng thẳng đứng trong trƣờng hợp cấp của N là chẵn. Đối với cây tứ phân điểm thì nút N phân một vùng mà nó biểu diễn do vẽ cả đƣờng thẳng đứng và đƣờng nằm ngang qua điểm (N.XVAL, N.YVAL). Bốn phần đƣợc tạo ra đƣợc gọi là các góc NW (Tây Bắc), SW (Tây Nam), NE (Đông Bắc) và SE (Đông Nam) xác định bởi nút N và mỗi góc tƣơng ứng với một con của nút N. Do đó các nút trong cây bốn nhánh có thể xác định 4 cành. Trƣớc khi thực hiện các thao tác đối với cây bốn cành định nghĩa đơn giản của cấu trúc nút cho một nút của cây tứ phân đƣợc đƣa ra nhƣ sau:
qtnodetype = record INFO: infotype; XVAL: real; YVAL: real;
NW, SW, NE, SE; qtnodetype; end
2.3.1 Chèn / tìm kiếm trong cây tứ phân điểm
Thực hiện khảo sát tập 5 điểm (Banja Luka, Derventa, Teslic, Tuzla và Sinj)
đã đƣợc thể hiện với cây 2-d, nó sẽ đƣợc thể hiện nhƣ thế nào thông qua một cây tứ phân. Hình 2.7 thể hiện việc chèn từng điểm vào cây, có hình 2.8 cho thấy cây tứ phân đƣợc xây dựng nhƣ thế nào.
Tiến trình này đƣợc mô tả nhƣ sau:
1. Khởi đầu cây tứ phân là rỗng, việc chèn Banja Luka tạo ra nút gốc của cây đƣợc gán nhãn với cặp (19, 45).
2. Việc chèn Derventa tạo ra vùng miêu tả bởi Banja Luka đƣợc phân thành 4 phần thông qua việc vẽ một đƣờng thẳng nằm ngang và một đƣờng thẳng đứng qua (19, 45). Derventa, ở vị trí (40, 50), nằm trong góc phần tƣ NE, do vậy Banja Luka
có con NE là Derventa.
e) Hình 2.7
Hình 2.8
3. Việc chèn Teslic đƣợc tiến hành nhƣ sau: Teslic nằm theo hƣớng Đông Nam (SE) của Banja Luka. Do vùng này hiện tại chƣa có điểm nào nên Teslic đƣợc đặt làm con SE của Banja Luka.
4. Việc chèn thêm Tuzla phức tạp hơn. Nhận thấy rằng Tuzla nằm ở SE của
Banja Luka. Do vậy, thực hiện chuyển đến nhánh SE của Banja Luka. Kết quả là góc phần tƣ SE đƣợc chia bởi vẽ đƣờng nằm ngang và đƣờng thẳng đứng qua điểm
Teslic. Với kết quả bốn phần đƣợc tạo ra, Tuzla ở góc SE và nhƣ vậy Tuzla trở thành nút con SE của Teslic.
5. Cuối cùng, việc chèn Sinj là không quá phức tạp bởi vì nó nằm ở SW của
Banja Luka. Do hiện tại con trỏ này là rỗng vậy nên đặt nút này chứa thông tin liên quan đến Sinj.
Nhìn chung chiều cao của một cây tứ phân chứa n nút có thể có giá trị lớn nhất là n-1, điều đó có nghĩa là thời gian để tìm kiếm hay chèn là nhỏ hơn số lƣợng nút. [6,17]
2.3.2 Thao tác xoá cây tứ phân điểm
Khi xóa nút N từ cây tứ phân có gốc T cũng có những nét giống nhƣ khi thực hiện với cây 2-d để tìm một nút thay thế thích hợp cho các nút không phải là lá. Đối với trƣờng hợp các nút lá thì việc xoá không có vấn đề gì: Đặt trƣờng liên kết tƣơng ứng của nút cha của N trỏ tới NIL và giải phóng không gian lƣu trữ.
Việc xoá trong cây tứ phân là rất phức tạp. Hình 2.9 chỉ ra tại sao lại phức tạp. Đầu tiên mỗi nút trong cây tứ phân thể hiện trong một vùng và vùng này đƣợc định nghĩa hơi khác so với cây 2-d. Đối với cây 2-d nó đủ để kết hợp 4 ràng buộc dƣới dạng xc1, x<c2, yc3, y<c4 với các hằng số c1,….,c4. Do đó nhƣ trong trƣờng hợp
cây 2-d khi mở rộng nodetype thành cấu trúc mới newnodetype, trong trƣờng hợp này cũng có thể mở rộng cấu trúc nút qtnodetype thành một cấu trúc mới
newnodetype,với cùng với kiểu trƣờng trên đây (XLB,YLB,XUB,YUB).
newqtnodetype = record INFO: infotype; XVAL, YVAL: real;
XLB, YLB, XUB, YUB: real {-, +}; NW, SW, NE, SE: newqtnodetype
end
Khi chèn nút N vào cây T phải đảm bảo những điểm dƣới đây:
Nếu N là gốc của cây T, thì N.XLB=-, N.YLB=-, N.XUB=+, và N.YUB=+.
2. Nếu P là cha của N thì khi đó bảng 2.2 dƣới đây mô tả những giá trị của các trƣờng XLB, YLB, XUB, YUB của N tuỳ thuộc vào việc N là con NW, SW, NE hay SE của P, trong đó sử dụng ký hiệu w=(P.XUB-P.XLB) và h=(P.YUB-P.YLB).
Trƣờng hợp N.XLB N.XUB N.YLB N.YUB
N= P.NW P.XLB P.XLB + w x 0.5 P.YLB + h x 0.5 P.YUB
N=P.SW P.XLB P.XLB + w x 0.5 P.YLB P.YLB + h x 0.5
N=P.NE P.XLB + w x 0.5 P.XUB P.YLB + h x 0.5 P.YUB
N=P.SE P.XLB + w x 0.5 P.XUB P.YLB P.YLB + h x 0.5
Bảng 2.2
Để vận dụng thành công kỹ thuật xoá trong với cây tứ phân điểm thì khi xoá một nút trong N phải tìm một nút thay thế R từ một trong các cây con của N ( từ một trong N.NW, N.SW, N.NE, N.SE) sao cho mỗi nút R1 trong N.NW là ở phía tây bắc của R, và mỗi nút R2 trong N.SW ở phía tây nam R, mỗi nút R3 trong N.NE ở phía đông bắc của R và mỗi nút R4 trong N.SE ở phía đông nam của R.
Hãy xem xét cây tứ phân trên hình 2.8 và hình 2.9. Giả sử, muốn xoá Banja Luka từ cây tứ phân này. Trong trƣờng hợp này, nút thay thế thực tế đƣợc tìm là
Teslic. Không nút nào khác thoả mãn những điều kiện đã đặt ra ở trên. Tuy nhiên, không phải luôn có khả năng tìm đƣợc một nút thay thế. Do vậy trong trƣờng hợp
xấu nhất việc xoá một nút N có thể yêu cầu việc chèn lại một số nút trong cây con trỏ bởi N.NE, N.SE, N.NW và N.SW.[17]
2.3.3 Truy vấn khoảng trong cây tứ phân điểm
Các truy vấn khoảng trong cây tứ phân đƣợc thực hiện gần nhƣ cách thức thực hiện trong cây 2-d. Mỗi nút trong một cây tứ phân thể hiện một vùng và phƣơng pháp tính toán và truy vấn khoảng tránh việc tìm kiếm các cành bắt nguồn từ những nút mà các vùng lên quan đến chúng không giao với đƣờng tròn định nghĩa bởi truy vấn khoảng. Giả thiết rằng, cần phải tìm kiếm cây tứ phân điểm bắt nguồn từ T với tất cả các điểm trong một đƣờng tròn C, tâm (xc, yc) và có bán kính là r, giải thuật đƣợc nêu ra nhƣ sau:[6,17]
Giải thuật 2.1
Proc RangeQueryPointQuadtrees(T: newqtnodetype, C: cirle) 1.If region(T) C = then Halt
2. else
(a) If (T.XVAL, T.YVAL)C then print (T.XVAL, T.YVAL); (b) RangeQueryPointQuadtree(T.NW,C);
(c) RangeQueryPointQuadtree(T.SW,C); (d) RangeQueryPointQuadtree(T.NE,C); (e) RangeQueryPointQuadtree(T.SE,C); End proc