Các khái niệmCác CTDL mảng, danh sách đã nghiên cứu trong bài 3 được gọi là các cấu trúc tuyến tính, nghĩa là quan hệ lân cận giữa các thành phần được hiển thị ra.Trên thực tế, có nhiều đối tượng mà quan hệ lân cận giữa các phần tử không được hiển thị ra, gọi là các cấu trúc phi tuyến. Các CTDL cây, cấu trúc đồ thị, cấu trúc đa danh sách, danh sách tổng quát đều là các cấu trúc phi tuyến.Trong đó cây là 1 CTDL phi tuyến được ứng dụng rất nhiều trong các mô hình tin học.Khái niệm về cây: Cây (tree) là 1 tập hợp hữu hạn các nút trong đó có 1 nút đặc biệt gọi là nút gốc (root). Giữa các nút có 1 quan hệ phân cấp gọi là Quan hệ cha con.
Trang 1BÀI 4: CÂY NH Ị PHÂN
4.1 Các khái niệm
4.2 Cây nhị phân
4.3 Một số ứng dụng
4.4 Bài tập
Trang 24.1 Các khái niệm
Các CTDL mảng, danh sách đã nghiên cứu trong bài 3
được gọi là các cấu trúc tuyến tính , nghĩa là quan hệ lân cận giữa các phần tử được hiển thị ra
Trên thực tế, có nhiều đối tượng mà quan hệ lân cận giữa các phần tử không được hiển thị ra, gọi là các cấu trúc phi tuyến Các CTDL cây , cấu trúc đồ thị, cấu trúc
đa danh sách, danh sách tổng quát đều là các cấu trúc phi
tuyến.
Trong đó cây là 1 CTDL phi tuyến được ứng dụng rất nhiều trong các mô hình tin học.
Trang 3Khái niệm
Khái niệm: Cây (tree) là 1 tập hợp hữu hạn các nút
trong đó có 1 nút đặc biệt gọi là nút gốc ( root ) Giữa các nút có 1 quan hệ phân cấp gọi là “ quan hệ cha con ”.
Quy ướ c: Cây có 0 nút gọi là cây rỗng (null tree)
Trang 5Cấp cao nhất của 1 nút trên cây gọi là cấp của cây đó.
Ví dụ: cây đã cho là cây cấp 3
Gốc của cây người ta gán cho số mức là 1, nếu nút cha
có mức là i thì nút con sẽ có mức là i+1.
Ví dụ: nút A có số mức là 1, D có số mức là 2, G có số
mức là 3 và J có số mức là 4
Trang 6Mức của các nút trên cây
Trang 74.1 Các khái niệm
Chiều cao hay chiều sâu của 1 cây là số mức lớn nhất của nút có trên cây đó.
Ví dụ: cây đã cho có chiều cao là 4
Nếu n1, n2, …, nk là dãy các nút mà ni là cha của ni+1 với
1 ≤ i < k thì dãy đó gọi là đường đi từ n1 đến nk Độ dài của đường đi bằng số nút trên đường đi trừ đi 1.
Ví dụ: độ dài đường đi từ A tới G là 2, từ A tới K là 3
Nếu thứ tự các cây con của 1 nút được coi trọng thì cây
đó là cây có thứ tự , ngược lại là cây không có thứ tự
Thứ tự các cây con của 1 nút được đặt từ trái sang phải
Tập hợp các cây phân biệt được gọi là rừng (forest), 1 cây cũng là 1 rừng Nếu bỏ nút gốc trên cây thì sẽ tạo
Trang 8được lưu trữ ở các nút lá, các toán tử được lưu trữ ở cácnút nhánh, mỗi nhánh là 1 biểu thức con.
Trang 9Cây biểu diễn biểu thức số học
Toán hạng được lưu trữ ở các nút lá
Toán tử (hay phép toán ) được lưu trữ ở các nút nhánh Mỗi nhánh là 1 biểu thức con.
Ví dụ: Cây biểu diễn biểu thức (A / B + C) * (D – E)
Trang 104.2.1 Khái niệm và tính chất
4.2.2 Biểu diễn cây nhị phân
4.2.3 Phép duyệt cây nhị phân
Trang 114.2.1 Khái niệm và tính chất
Khái niệm: Cây nhị phân là 1 dạng quan trọng của cấu trúc cây, có đặc điểm là mọi nút trên cây chỉ có tối đa 2 nhánh con Với 1 nút, ta phân biệt cây con trái và cây con phải của nút đó.
Cây nhị phân là cây có thứ tự
Các khái niệm đối với cây đều có thể áp dụng đối với cây
Trang 12Một số dạng cây nhị phân đặc biệt
Trang 13Một số dạng cây nhị phân đặc biệt
Trang 14Một số dạng cây nhị phân đặc biệt
Các cây con a, b, c, d được gọi là cây nhị phân suy biến
vì thực chất nó có dạng của 1 danh sách tuyến tính.
a gọi là cây lệch trái, b gọi là cây lệch phải, c và d gọi là
cây zic - zắc
Nhận xét: Trong các cây nhị phân có cùng số lượng nút
như nhau thì cây nhị phân suy biến có chiều cao lớn
nhất
Cây e, f gọi là cây nhị phân hoàn chỉnh
Các nút (trừ nút cu ố i cùng) đều đạt tối đa
f có các nút tối đa trên mọi mức, còn gọi là cây nhị phân
đầy đủ, đây 1 t/h đặc biệt của cây nhị phân hoàn chỉnh.Trong các cây nhị phân có cùng số lượng nút như nhauthì cây nhị phân hoàn chỉnh thì có chiều cao nhỏ nhất
Trang 154.2.2 Biểu diễn cây nhị phân
Có 2 cách để biểu diễn cây nhị phân:
Trang 18Nhược điểm
Trong trường hợp cây nhị phân không đầy đủ, ta có thể:
1 Thêm vào 1 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
2 Hoặc dùng thêm 1 mảng phụ để đánh dấu những nút nào
là nút giả mà tự ta thêm vào
Nhược điểm: Chính vì lý do này nên với cây nhị phân
không đầy đủ, sẽ gặp phải sự lãng phí bộ nhớ vì có thể sẽ phải thêm rất nhiều nút giả vào thì mới được cây nhị phân đầy đủ.
Ví dụ: với cây lệch trái có chiều cao 5, phải dùng 1 mảng
T có 31 phần tử để lưu cây nhị phân chỉ gồm 5 nút
Trang 19Biểu diễn cây lệch trái bằng mảng
Trang 20Biểu diễn bằng cấu trúc 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à 1 bản ghi ( record, struct ), gồm 3 trường:
1.info: Chứa giá trị lưu tại nút đó
2.left: Chứa liên kết tới nút con trái, nghĩa là chứa 1 thôngtin đủ để biết nút con trái của nút đó là nút nào, trong
trường hợp không có nút con trái: left == null
3.right: Chứa liên kết tới nút con phải, nghĩa là chứa 1thông tin đủ để biết nút con phải của nút đó là nút nào,trong trường hợp không có nút con phải: right == null
Đối với cây chỉ cần phải quan tâm đến nút gốc , bởi từ nút gốc, đi theo các hướng liên kết left , right có thể duyệt mọi nút khác của cây.
Trang 21Cấu trúc nút của cây nhị phân
Cấu trúc nút của cây:
Khai báo cây nhị phân bằng cấu trúc liên kết:
typedef struct node
{
int info; //Dữ liệu của nút
node *left, *right; //Con trỏ trỏ tới nút con trái và phải
}
node* head; //Con trỏ trỏ tới nút gốc của cây
Trang 22Biểu diễn bằng cấu trúc liên kết
Có thể biểu diễn cây nhị phân bằng cấu trúc liên kết, với cấu trúc nút đã trình bày như sau:
Trang 234.2.3 Phép duyệt cây nhị phân
Thường phải thực hiện các phép xử lý trên mỗi nút của cây theo 1 thứ tự nào đó.
Ví dụ: Đối với cây biểu diễn biểu thức số học, để xác
định giá trị của biểu thức ta sẽ phải xử lý ở mỗi nút trên
cây như sau:
1 Nếu là nút biểu diễn toán hạng ta sẽ xác định giá trị của
toán hạng đó
2 Nếu là nút biểu diễn dấu phép toán ta sẽ áp đặt phép
toán đó lên giá trị của các cây con của nút ấy
3 Ta không thể thực hiện phép toán này, nếu các cây con
chưa được xử lý Từ đó ta thấy: thứ tự xử lý nút trên cây
là rất quan trọng
Trang 24Nếu 1 nút không có nút con trái (hoặc phải) thì liên kết left
(right) của nút đó được liên kết tới 1 nút đặc biệt là null
Nếu cây rỗng thì nút gốc của cây đó được gán bằng null.Khi thăm 1 cây rỗng thì duyệt nghĩa là không làm gì cả
Có 3 cách duyệt cây hay được sử dụng:
1.Duyệt theo thứ tự trước (preorder traversal)
2.Duyệt theo thứ tự giữa (inorder traversal)
3.Duyệt theo thứ tự sau (postorder traversal)
Trang 25Duyệt theo thứ tự trước
Giá trị trong mỗi nút bất kỳ sẽ được liệt kê trước giá trị lưu trong 2 nút con của nó.
Quá trình duyệt bắt đầu bằng lời gọi: Visit(head)
Trang 26Duyệt theo thứ tự giữa
Giá trị trong mỗi nút bất kỳ sẽ được liệt kê sau giá trị lưu
ở nút con trái và trước giá trị lưu ở nút con phải của nó
Quá trình duyệt bắt đầu bằng lời gọi: Visit(head)
Kết quả duyệt với cây đã cho: H D I B E J A K F C G L
Trang 27Duyệt theo thứ tự sau
Giá trị trong mỗi nút bất kỳ sẽ được liệt kê sau giá trị lưu
Quá trình duyệt bắt đầu bằng lời gọi: Visit(head)
Trang 284.3.1 Cây biểu diễn biểu thức
4.3.2 Cây nhị phân tìm kiếm (BST)
4.3.3 Cây BST cân bằng hoàn toàn
4.3.4 Cây cân bằng (AVL)
Trang 294.3.1 Cây biểu diễn biểu thức
Bài toán tính toán giá trị của biểu thức số học có thể
được thực hiện bằng cây biểu diễn đa thức.
Ví dụ: Cây biểu diễn biểu thức (A / B + C) * (D – E)
Sau đó sử dụng 1 trong các phép duyệt cây để tính toán giá trị biểu thức.
Trang 30Biểu thức số học gồm các toán tử 2 ngôi được biểu diễn
rất tự nhiên bằng cấu trúc cây nhị phân
Đối với các toán tử 1 ngôi (dấu âm -, dấu dương +, phép
phủ định): ta coi toán hạng luôn là con phải của nó
Trang 314.3.2 Cây nhị phân tìm kiếm
Khái niệm: Cây nhị phân tìm kiếm ( Binary Search Tree
nút đang xét lớn hơn khóa của tất cả các nút thuộc cây con trái và nhỏ hơn khóa của tất cả các nút thuộc cây con phải
Trang 32Kết luận: Để có độ phức tạp giải thuật luôn là O(log2N)
cần có cải tiến cấu trúc của cây BST: cây nhị phân tìm kiếm cân bằng hoàn toàn, cây AVL,
Trang 334.3.2 Cây nhị phân tìm kiếm
Dãy số mô tả bằng cấu trúc cây nhị phân tìm kiếm:
Trang 344.3.3 Cây BST cân bằng hoàn toàn
Khái niệm: Cây nhị phân tìm kiếm cân bằng hoàn toàn
là cây nhị phân tìm kiếm ( BST ) mà tại mỗi nút của nó, số nút của cây con trái chênh lệch không quá 1 so với số nút của cây con phải.
Đ ánh giá:
Nếu cây cân đối thì việc tìm kiếm sẽ nhanh
Đối với cây cân bằng hoàn toàn có N nút, trong trường
hợp xấu nhất chỉ phải tìm qua log2N phần tử
Trang 354.3.3 Cây BST cân bằng hoàn toàn
Nhận xét:
Một cây BST rất khó đạt được trạng thái cân bằng hoàntoàn và cũng rất dễ mất cân bằng vì khi thêm hay xóa cácnút trên cây có thể làm cây mất cân bằng (xác suấ t r ấ t
Trang 36This image cannot currently be display ed.
Trang 374.3.3 Cây BST cân bằng hoàn toàn
Nếu bổ sung thêm khóa 50 vào cây BST thì cây không còn cân bằng hoàn toàn nữa (do vi phạm điều kiện cân bằng ở 88 ).
Trang 384.4.4 Cây cân bằng AVL
Khái niệm: Cây nhị phân tìm kiếm cân bằng ( AVL ) là cây BST mà tại mỗi nút của nó độ cao của cây con trái
và của cây con phải chênh lệch không quá 1.
Cây nhị phân tìm kiếm cân bằng hoàn toàn là cây AVL,
nhưng điều ngược lại chưa chắc đúng
Lịch sử:
AVL là tên viết tắt của các tác giả người Nga là Velskii và Landis (1962) Thuật ngữ cây AVL thường
Adelson-được thay cho cây BST cân b ằ ng.
Ứng dụng trong nhiều bài toán khác nhau và thu hútnhiều nghiên cứu
Một số loại CTDL phát triển thêm từ cây AVL: cây đỏ
-đen (Red-Black Tree), B-Tree, …
Trang 394.4.4 Cây cân bằng AVL
Đ ánh giá:
Cây AVL là cấu trúc dữ liệu ổn định hơn hẳn cây nhị
phân tìm kiếm cân bằng hoàn toàn, vì chỉ khi thêm, xóacác nút làm cây thay đổi chiều cao, các trường hợp mấtcân bằng mới có khả năng xảy ra
Cây AVL với chiều cao được khống chế sẽ cho phép
thực thi các thao tác tìm thêm hủy với chi phí O(log2N)
và bảo đảm không suy biến thành O(N)
Phép xoay cây AVL: Khi xảy ra mất cân bằng, để đưa
cây về trạng thái cân bằng thì phải thực hiện các phép xoay tại nút xảy ra mất cân bằng.
Trang 404.4.4 Cây cân bằng AVL
Đây là cây AVL nhưng không phải là cây nhị phân tìm
kiếm cân bằng hoàn toàn.
Nếu bổ sung thêm khóa 50 vào cây AVL thì cây không còn cân bằng nữa (do vi phạm điều kiện cân bằng ở 88 ).
Trang 41Kết luận
Rõ ràng đối với cây nhị phân bất kỳ thì cách tổ chức cây theo cấu trúc liên kết tỏ ra thích hợp hơn cách tổ chức bằng mảng 1 chiều.
Tuy nhiên, cách cài đặt này cũng có những nhược điểm nhất định:
1 Tốc độ xử lý chậm hơn do chỉ có nút gốc của cây có thểđược truy cập trực tiếp còn các nút khác chỉ được truy
cập sau khi đã qua 1 số bước duyệt cây
2 Tốn bộ nhớ hơn do ngoài trường info phải có thêm trường
left và right ở mỗi nút để lưu trữ địa chỉ nút con trái và nútcon phải của nút đó
Trang 424.4 Bài tập
1 Mối liên hệ giữa số nút, chiều cao và loại cây:
a) Trong các cây nhị phân có cùng số nút N, loại cây nào
có chiều cao lớn nhất và H = ?b) Trong các cây nhị phân có cùng số nút N, loại cây nào
có chiều cao nhỏ nhất và H = ?c) Trong các cây nhị phân có cùng chiều cao H, loại cây
nào có số nút lớn nhất và N = ?d) Trong các cây nhị phân có cùng chiều cao H, loại cây
nào có số nút nhỏ nhất và N = ?e) Có gì khác khi xét cây nhị phân biểu diễn biểu thức số
học chỉ gồm các phép toán 2 ngôi?
Trang 434.4 Bài tập
2 Cây nhị phân biểu diễn biểu thức:
Cho biểu thức số học: A + (B – C) * D / E + F
Vẽ cây nhị phân biểu diễn biểu thức số học Cho biết
chiều cao của cây?
Duyệt cây theo thứ tự trước (giữ a, sau).
Viết hàm đệ quy duyệt cây theo thứ tự trước (giữ a, sau)
và chỉ ra 3 đặc điểm của hàm đệ quy
Liên hệ với bài toán ký pháp Ba Lan
Trang 44Duyệt cây theo thứ tự trước (giữ a, sau).
Viết hàm đệ quy duyệt cây theo thứ tự trước (giữ a, sau)
và chỉ ra 3 đặc điểm của hàm đệ quy
Trang 45Chỉ rõ các trường hợp mất cân bằng trong quá trình bổ
sung các số vào cây AVL và cách xoay để cây trở lại
trạng thái cân bằng
Duyệt cây theo thứ tự trước (giữ a, sau).
Viết hàm đệ quy duyệt cây theo thứ tự trước (giữ a, sau)
và chỉ ra 3 đặc điểm của hàm đệ quy
Tại sao trên thực tế cây AVL được sử dụng rộng rãi câyBST?