Professional Documents
Culture Documents
I. MỤC TIÊU:
Giúp sinh viên hiểu được cấu trúc cây thứ tự bộ phận và cài đặt các phép toán trên cây thứ
tự bộ phận. Bài thực hành này sẽ cài đặt hàng ưu tiên bằng cây thứ tự bộ phận.
II. TÓM TẮT LÝ THUYẾT:
Hàng ưu tiên (priority queue) được xem là một tập hợp các đối tượng dữ liệu, mỗi đối tượng
có một giá trị ưu tiên. Thông thường các giá trị ưu tiên có thể là các số nguyên, các số thực,
các ký tự…; điều quan trọng là chúng ta có thể so sánh được các giá trị ưu tiên.
Các phép toán trên hàng ưu tiên:
1. Insert (P,x). Xen vào hàng ưu tiên P đối tượng x.
2. FindMin(P). Hàm trả về đối tượng trong P có giá trị ưu tiên nhỏ nhất (đối tượng được ưu
tiên nhất). Phép toán này đòi hỏi P không rỗng
3. DeleteMin(P). Loại bỏ và trả về đối tượng có giá trị ưu tiên nhỏ nhất trong P. P cũng cần
phải không rỗng
Có nhiều phương pháp cài đặt hàng ưu tiên:
• Bằng danh sách
• Bằng cây nhị phân tìm kiếm
• Bằng cây thứ tự bộ phận
Trong bài thực hành này chúng ta sẽ cài đặt hàng ưu tiên bằng cây thứ tự bộ phận.
Trong cây nhị phân tìm kiếm, các khóa của dữ liệu chứa trong các đỉnh của cây cần phải thỏa
mãn tính chất thứ tự: khóa của một đỉnh bất kỳ lớn hơn khóa của các đỉnh trong cây con trái và
nhỏ hơn khóa của các đỉnh trong cây con phải.
Trong cây thứ tự bộ phận, chỉ đòi hỏi các khóa chứa trong các đỉnh thỏa mãn tính chất thứ
tự bộ phận: Khóa của một đỉnh bất kỳ nhỏ hơn hoặc bằng khóa của các đỉnh con của nó.
• Cây nhị phân đầy đủ:
• Cây rỗng (độ cao bằng 0)
• Cây có 1 nút gốc (độ cao bằng 1)
• Cây nhĩ phân có độ cao lớn hơn hoặc bằng 2 được xem là đầy đủ nếu tất cả các đỉnh
ở mức trên (mức 1,2 3…) đều có đầy đủ cả 2 cây con
Ví dụ:
• Ở mức h-1, nếu 1 đỉnh chỉ có 1 con thì các đỉnh đứng trước nó (nếu có) có
đầy đủ 2 con, nếu 1 đỉnh chỉ có 1 con thì nó phải là đỉnh con trái.
• Ví dụ:
Cây thứ tự bộ phận (partially ordered tree, hoặc heap) là một cây nhị phân hoàn toàn và thỏa
mãn tính chất thứ tự bộ phận. Ví dụ, cây nhị phân trong hình sau là cây thứ tự bộ phận
Dòng Mã lệnh
1 void init(PriQueue &pq)
2 {
3 pq.count = 0;
4 }
5 bool isEmpty(PriQueue pq)
6 {
7 return pq.count == 0;
8 }
9 bool isFull(PriQueue pq)
10 {
11 return pq.count == MAX;
12 }
13 int getFirst(PriQueue pq)//top
14 {
15 if (pq.count == 0)
16 {
17 cout << "khong co phan tu";
18 return 0;
19 }
20 return pq.list[0];
21 }
22
23 int getParent(int i)
24 {
25 return (i - 1) / 2;
26 }
27 int getLeft(int i)
28 {
29 return (2 * i + 1);
30 }
31 int getRight(int i)
32 {
33 return (2 * i + 2);
34 }
35 void shiftDown(PriQueue &pq, int i)
36 {
37 //lấy con trái và con phải của nút tại vị trí i
38 int left = getLeft(i);
39 int right = getRight(i);
40 int smallest = i;
41