You are on page 1of 28

Cấu trúc dữ liệu và giải

thuật
Cây– Phần 2

University of Technology and Engineering


Vietnam National University Hanoi
Cây là gì?
➢ Trong khoa học máy
tính, một cây là một Computers ‘R’ Us
mô hình trừu tượng
của một cấu trúc
phân cấp Sales Manufacturing R&D
➢ Cây bao gồm tập
các đỉnh (node) và
US International Laptops Desktops
các mối liên hệ giữa
đỉnh cha và đỉnh
con. Europe Asia Canada
➢ Các ứng dụng:
❖ Lược đồ của các
tổ chức
❖ Hệ thống files 2
Biểu diễn cây

Template <class Item> Gốc


class Node {
Item data;
A
List<Node*> children;
}
B C D

Node<Item>* root;

E F G
3
Hàng đợi ưu tiên
➢ Hàng đợi ưu tiên lưu trữ một
tập các đội tượng
➢ Mỗi đối tượng bao gồm một
cặp (key, value)
➢ Các phép toán chính của hàng
đợi ưu tiên
❖ insert(k, x)
Chèn một đối tượng có khóa k
và giá trị x
❖ removeMax()
Loại bỏ và trả về đội tượng có
khóa lớn nhất y

➢ Ví dụ:
4
Hàng đợi ưu tiên

➢ Các phép toán khác


❖ max()
Trả về đối tượng có khóa lớn nhất nhưng không loại bỏ ra khỏi cây
❖ size(), isEmpty()

➢ Các ứng dụng:


❖ Đấu giá
❖ Thị trường chứng khoán
❖ Xếp hàng check in máy bay

5
Cây heap
➢ Cây heap là một cây nhị phân thỏa mãn các
đỉnh trong có giá trị khóa lớn hơn hoặc bằng
giá trị khóa của các đỉnh con
➢ Ứng dụng: Xây dựng cây hàng đợi ưu tiên
44

42 35

33 31 19 27

10 26 14
6
Cây heap

Phép toán Max: Lấy thông tin của đỉnh gốc (có
giá trị khóa lớn nhất)
44

42 35

33 31 19 27

10 26 14

7
Chèn đối tượng

Algorithm insert(v):
➢ Step 1 − Tạo một đỉnh mới vào cuối heap.
➢ Step 2 − Bắt đầu từ đỉnh có giá trị cần chèn, so sánh giá
trị của nó với giá trị của cha. Nếu lớn hơn giá trị đỉnh
cha thì đổi chỗ, thực hiện tiếp bước 2.

8
Heap tree insertion

Insert 70 95

61 83

53 39 72 16

24 48 70

9
Heap tree insertion

Insert 70 95

61 83

53 70 72 16

24 48 39

10
Heap tree insertion

Insert 70 95

70 83

53 61 72 16

24 48 39

11
Exercise 2

➢ Xây dựng cây max heap bao gồm: 52, 69, 38, 79, 66, 64,
72, 3, 16, 89, 15, 37, 0, 28, 73, 95.

➢ Chèn các số sau: 5, 3, 9, 7, 2, 4, 6, 1, 8.

12
Loại bỏ đỉnh gốc

Algorithm remove_max (T)


➢ Step 1 − Loại bỏ đỉnh gốc.
➢ Step 2 − Di chuyển tới phần tử cuối cùng của cây heap tới
gốc
➢ Step 3 − Bắt đầu từ gốc, so sánh giá trị với các giá trị các
đỉnh con. Nếu nhỏ hơn giá trị lớn nhất của đỉnh con thì đổi
chỗ và tiếp tục bước 3.
13
Loại bỏ gốc

Trả về giá trị 95 95

70 83

53 61 72 16

24 48 39

14
Loại bỏ gốc

39

70 83

53 61 72 16

24 48

15
Loại bỏ gốc

83

70 39

53 61 72 16

24 48

16
Loại bỏ gốc

83

70 72

53 61 39 16

24 48

17
Bài tập 3
Mô tả các bước loại bỏ gốc của cây heap sau:

44

42 35

33 31 19 27

10 26 14

18
Độ phức tạp của các phép toán
• Phép toán Max : O(1)
• Phép toán chèn: Độ cao của cây
• Phép toán xóa: Độ cao của cây

Độ cao của cây :


❖ Trường hợp tồi nhất: O(n)
❖ Trường hợp tốt nhất: O(log n) khi cây
cân bằng

Cân bằng cây heap: Khi chèn hoặc xóa


làm cho cây heap không cân bằng, thực
hiện các phép toán cân bằng để cần
bằng lại cây.

19
Sử dụng thư viện cho cây heap
Sử dụng make_heap, pop_heap, push_heap, và
sort_heap từ thư viện của C++ để thực hiện các
nhiệm vụ sau:
❖ Tạo một cây heap
❖ Loại bỏ gốc
❖ Chèn một đỉnh vào cây
❖ Sắp xếp các phần tử trong cây

20
Cây tìm kiếm nhị phân
➢ Cây tìm kiếm nhị phân là
một cây nhị phân thỏa 6
mãn đỉnh cha nhỏ hơn
hoặc bằng con phải và lớn 2 9
hơn hoặc bằng con trái.
8
1 4
➢ Duyệt theo trung thứ tự
(inorder) trên cây cho kết
quả các đối tượng được
sắp xếp tăng dần theo
khóa

21
Tìm kiếm
➢ Để tìm kiểm một đỉnh có Algorithm TreeSearch(k, v)
khóa bằng k, Chúng ta if T.isExternal (v)
tìm từ trên xuống bắng return v;
đầu từ gốc if k • key(v)
➢ Đỉnh tiếp theo được thăm return TreeSearch(k, T.left(v));
phụ thuộc vào kết quả của else if k = key(v)
việc so sánh k với giá trị return v;
của đỉnh hiện tại else { k • key(v); }
➢ Nếu đỉnh hiện tại là đỉnh return TreeSearch(k, T.right(v));
lá thì khóa sẽ không tìm
thấy và hàm trả về giá trị 6
null •
➢ Ví dụ: find(4): 2
• 9
❖ Call TreeSearch(4,root)
1 4 = 8
22
Phép toán chèn
6

➢ Chèn đính có giá trị khóa 2 9

bằng k vào cây.
1 4 8
➢ Thuật toán: Bắt đầu từ gốc, so •
sánh k với đỉnh này. Nếu k
nhỏ hơn, chèn k vào bên trái w
cây. Ngược lại, chèn k vào
bên phải cây. 6
➢ Ví dụ: chèn 5 2 9

1 4 8
w
5

23
Phép toán xóa
6

➢ Để thực hiện phép toán xóa 2 9
phần tử bằng k remove(k), •
Chúng ta tìm đỉnh này từ gốc 1 4 v 8
➢ Giả sử rằng k ở trong cây, gọi v 5
là đỉnh chứa k
➢ Nếu đỉnh v là đỉnh lá, loại bỏ v.
Nếu đỉnh v có 1 con, loại bỏ v
và liên kết con của v tới cha 6
của v.
2 9
➢ Ví dụ: loại bỏ 4
1 5 8

24
Phép toán xóa (tiếp)
➢ Trong trường hợp v có 2 con: 1
❖ Tìm đỉnh w sau v trong thứ tự v
sắp xếp theo phương pháp 3
duyệt inorder (đỉnh lá trái nhất 2 8
của con phải của v).
❖ Thay thế v bởi w 6 9
❖ Loại bỏ đỉnh w w
5
➢ Ví dụ: Loại bỏ 3
1
v
5
2 8

6 9

25
Độ phức tạp
Các phép toán: Tìm kiếm, Chèn,
Xóa: Độ cao của cây

Độ cao của cây:


➢ Trường hợp tồi nhất: O(n)
➢ Trường hợp tốt nhất: O(log n)
Khi cây heap là cây cân bằng

Cân bằng cây heap: Khi chèn


hoặc xóa làm cho cây heap
không cân bằng, thực hiện các
phép toán cân bằng để cần
bằng lại cây.

26
Bài tập 4

➢ Tạo cây nhị tìm kiếm nhị phân (BST) từ các số: 34, 15, 65, 62,
69, 42, 40, 80, 50, 59, 23, 46, 57, 3, 29

➢ Vẽ các cây BST sau khi xóa các khóa 62, 42 và 3 từ cây trên.

27
Bài tập 5
➢ Vẽ cây BST
EASYQUE STI ON

➢ Vẽ cây BST
DATAS T R U C T R E SAN DALG O R I T H M

28

You might also like