Biểu diễn cây nhị phân

Một phần của tài liệu Các cấu trúc dữ liệu và giải thuật hiệu quả cho bài toán tìm kiếm (Trang 46 - 51)

ạ Biểu diễn bằng mảng

Ta có thể dễ dàng đánh số cho các nút trên cây theo thứ tự lần lƣợt từ mức một trở đi, hết mức này đến mức khác và từ trái qua phải đối với các nút ở mỗi mức, nếu ta có một cây nhị phân đầy đủ.

1

2 3

4 5 6 7

Hình 2.4. Đánh số các nút của cây nhị phân đầy đủ biểu diễn bằng mảng.

Con của nút thứ i sẽ là các nút thứ 2*i và 2*i+1. Cha của nút thứ j là nút j div 2. Do đó có thể lƣu cây bằng mảng T, nút thứ i của cây đƣợc lƣu trữ bằng phần tử T[i]. Với cây nhị phân đầy đủ ở Hình 2.6 thì khi lƣu trữ bằng mảng sẽ đƣợc mảng nhƣ sau:

A B C D E F G

Nếu trƣờng hợp cây nhị phân không đầy đủ, ta có thể thêm vào số nút giả để đƣợc cây nhị phân đầy đủ và gán những giá trị đặc biệt cho những phần tử trong mảng T tƣơng ứng với những nút này hoặc dùng thêm một mảng phụ để đánh dấu thêm những nút nào là nút giả tự ta thêm vào và việc tìm kiếm, thao tác trên cây rất hiệu quả. Cũng chính vì những lý do này nên với cây nhị phân không đầy đủ, ta sẽ gặp phải sự lãng phí bộ nhớ vì có thể thêm rất nhiều nút giả vào thì mới đƣợc cây nhị phân đầy đủ.

A

B C

39

Ví dụ với cây lệch phải, ta cần dùng một mảng 15 phần tử để lƣu cây nhị phân chỉ gồm 4 nút.

A B C D

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Ngoài ra, nếu cấu trúc của cây luôn luôn biến động (thƣờng xuyên có những thao tác thêm vào hay loại bỏ một nhánh con) thì các lƣu trữ này có thể khiến cho các thao tác đó kém hiệu quả.

b. Biểu diễn cây nhị phân bằng liên kết

- Khi biểu diễn cây nhị phân bằng cấu trúc liên kết, mỗi nút của cây là một bản ghi (record) gồm 3 trƣờng sau:

Left Info Right

A

B

C

40

 Trƣờng Info: chứa các giá trị lƣu tại nút đó.

 Trƣờng Left: chứa liên kết (con trỏ) tới nút con trái, tức là chứa một thông tin đủ để biết nút con trái là nút nào, trong trƣờng hợp không có nút con trái, trƣờng này đƣợc gán một giá trị đặc biệt (đƣợc gọi là nil).

 Trƣờng Right: chứa liên kết (con trỏ) tới nút con phải, tức là chứa một thông tin đủ để biết nút con phải là nút nào, trong trƣờng hợp không có nút con phải, trƣờng này đƣợc gán một giá trị đặc biệt (đƣợc gọi là nil).

- Đối với cây nhị phân ta chỉ cần quan tâm giữ lại nút tại gốc, bởi từ nút gốc, đi theo các hƣớng liên kết Left, Right ta có thể duyệt mọi nút khác.

Hình 2.5. Biểu diễn cây nhị phân bằng cấu trúc liên kết.

Để có thể truy cập vào các nút trên cây cần có một con trỏ T, trỏ tới nút gốc của cây đó. Ngƣời ta quy ƣớc: nếu cây nhị phân rỗng thì T = nil. Với cách biểu diễn này từ nút cha có thể truy cập trực tiếp vào nút con những ngƣợc lại thì không làm đƣợc. A C B E F G D I H J K

41

Sử dụng con trỏ tiết kiệm rất nhiều bộ nhớ nhƣng việc cài đặt không dễ chút nào vì cấu trúc con trỏ khó hiểu và mỗi khi thêm, xóa hay tìm kiếm một phần tử trong cây thì phải duyệt cây lại từ đầu (bắt đầu từ gốc).

c. Duyệt cây nhị phân

Bằng cách thăm qua tất cả các đỉnh của cây, mỗi đỉnh đúng một lần. Thao tác duyệt cây là một trong những thao tác quan trọng của cây nói chung và cây nhị phân nói riêng, phụ thuộc vào thứ tự duyệt nút gốc của câỵ

Có 3 cách duyệt chính có thể áp dụng trên cây nhị phân: - Duyệt theo thứ tự trƣớc (NLR)

- Duyệt theo thứ tự giữa (LNR) - Duyệt theo thứ tự sau (LRN)

Duyệt theo thứ tự trước (Node-Left-Right)

Duyệt theo kiểu này, trƣớc hết ta thăm nút gốc sau đó thăm các nút của cây con trái rồi đến cây con phảị

Thủ tục duyệt nhƣ sau:

procedure NLR (N); {duyệt nhánh cây nhận N là nút gốc của nhánh đó} Begin

If N ≠ nil then Begin

output trƣờng Info của nút N; NLR(nút con trái của N); NLR(nút con phải của N); End;

End;

Duyệt theo thứ tự giữa (Left- Node-Right)

Duyệt theo kiểu này, trƣớc hết ta thăm các nút của cây con trái sau đó thăm nút gốc rồi mới đến cây con phảị

42 Thủ tục duyệt nhƣ sau:

procedure LNR (N); {duyệt nhánh cây nhận N là nút gốc của nhánh đó} Begin

If N ≠ nil then Begin

LNR(nút con trái của N); output trƣờng Info của nút N; LNR (nút con phải của N); End;

End;

Duyệt theo thứ tự sau (Left-Right - Node)

Kiểu duyệt này, trƣớc hết ta thăm các nút của cây con trái sau đó thăm đến cây con phải rồi cuối cùng mới thăm nút gốc rồị

Thủ tục duyệt nhƣ sau:

procedure LRN (N); {duyệt nhánh cây nhận N là nút gốc của nhánh đó} Begin

If N ≠ nil then Begin

LRN (nút con trái của N); LRN (nút con phải của N); output trƣờng Info của nút N; End;

43

Một phần của tài liệu Các cấu trúc dữ liệu và giải thuật hiệu quả cho bài toán tìm kiếm (Trang 46 - 51)

Tải bản đầy đủ (PDF)

(110 trang)