Nội dung2 Cấu trúc cây Tree Cấu trúc cây nhị phân Binary Tree Cấu trúc cây nhị phân tìm kiếm Binary Search Tree Cấu trúc cây nhị phân tìm kiếm cân bằng AVL Tree... Nội dung17
Trang 1Chương 7: CÂY (Tree)
Trang 2Nội dung
2
Cấu trúc cây (Tree)
Cấu trúc cây nhị phân (Binary Tree)
Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)
Cấu trúc cây nhị phân tìm kiếm cân bằng
(AVL Tree)
Trang 3Tree – Định nghĩa
3
Cây là một tập gồm 1 hay nhiều nút T, trong đó
có một nút đặc biệt được gọi là gốc , các nút còn lại được chia thành những tập rời nhau T1,
T2 , , Tn theo quan hệ phân cấp trong đó Ticũng là một cây
A tree is a set of one or more nodes T such that:
i there is a specially designated node called a root
ii The remaining nodes are partitioned into n
disjointed set of nodes T1, T2,…,Tn, each of which is
a tree
Trang 4Nội địa Quốc tế
Châu âu Mỹ Các nước
Trang 5Tree – Ví dụ
Cây thư mục
5
Trang 6Tree – Ví dụ
Trang 8Tree - Một số khái niệm cơ bản
Bậc của một nút (Degree of a Node of a Tree):
Là số cây con của nút đó Nếu bậc của một nút bằng 0 thì nút đó gọi là nút lá (leaf node)
Bậc của một cây (Degree of a Tree):
Là bậc lớn nhất của các nút trong cây Cây
có bậc n thì gọi là cây n-phân
Trang 9Tree - Một số khái niệm cơ bản
10
Nút nhánh:
Là nút có bậc khác 0 và không phải là gốc
Mức của một nút (Level of a Node):
Trang 11Trắc nghiệm
The depth of a tree is the _ of a tree
a) number of nodes on the tree b) number of levels of a tree c) number of branches
12
Trang 12Nội dung
17
Cấu trúc cây (Tree)
Cấu trúc cây nhị phân (Binary Tree)
Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)
Cấu trúc cây nhị phân tìm kiếm cân bằng
(AVL Tree)
Trang 13Binary Tree – Định nghĩa
18
Cây nhị phân là cây mà mỗi nút có tối đa
2 cây con (cây có bậc là 2)
Trang 14Binary Tree – Ví dụ
19
Cây con trái
Cây con phải
Hình ảnh môôt cây nhị phân
Trang 15Binary Tree – Ví dụ
Cây lệch trái và cây lệch phải
Trang 16Binary Tree – Ví dụ
Cây nhị phân đầy đủ ( A full binary tree )
Trang 17Binary Tree – Ứng dụng
Cây biểu thức: được dùng để biểu diễn một biểu thức toán học
22
Trang 18Binary Tree – Ví dụ
Cây quyết định: được dùng để hỗ trợ quá trình ra quyết định
23
Trang 19Binary Tree – Một số tính chất
Số nút nằm ở mức i ≤ 2 i
Số nút lá ≤ 2 h-1 , với h là chiều cao của cây
Số nút trong cây ≤ 2 h -1, với h là chiều cao của cây
Chiều cao của cây ≥ log 2 N, với N là số nút trong cây
24
Trang 20Trắc nghiệm
A binary tree is a tree in which each node
references at most _ node(s)
If the depth of a binary tree is 3, then what
is the maximum size of the tree?
25
Trang 21Binary Tree - Biểu diễn
In general, any
binary tree can be represented using
an array, but it leads to the waste of storage …
Trang 22Binary Tree - Biểu diễn27
Trang 23Binary Tree - Biểu diễn28
Trang 24Binary Tree - Biểu diễn
29
Sử dụng cấu trúc để lưu trữ các thông tin của một nút gồm:
Dữ liệu của nút
Địa chỉ nút gốc của cây con trái
Địa chỉ nút gốc của cây con phải
Khai báo cấu trúc cây nhị phân:
Để quản lý cây nhị phân chỉ cần quản lý địa chỉ nút gốc:
Tree root;
struct TNode {
Trang 25Binary Tree – Khởi tạo cây
Khởi tạo cây rỗng:
void InitTree ( Tree &t) {
t = NULL ; }
31
Trang 26Binary Tree - Duyệt cây nhị phân
Trang 27Binary Tree - Duyệt cây nhị phân
Duyệt theo thứ tự trước NLR (Node-Left-Right)
Kiểu duyệt này trước tiên 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ải
Thủ tục duyệt có thể trình bày đơn giản như sau:
33
void NLR ( Tree t) {
if (t != NULL ) {
// Xử lý t tương ứng theo nhu cầu
NLR (t->pLeft);
NLR (t->pRight);
} }
Trang 28Binary Tree - Duyệt cây nhị phân NLR34
A B
L P
G M
A Kết quả: B D H I N E J O K C F L P G M
Trang 29Binary Tree - Duyệt cây nhị phân
Duyệt theo thứ tự giữa LNR (Left-Node-Right)
Kiểu duyệt này trước tiên thăm các nút của
cây con trái sau đó thăm nút gốc rồi đến
cây con phải
Thủ tục duyệt có thể trình bày đơn giản như sau:
35
void LNR ( Tree t) {
if (t != NULL ) {
LNR (t->pLeft);
//Xử lý nút t theo nhu cầu
LNR (t->pRight);
} }
Trang 30Binary Tree - Duyệt cây nhị phân LNR36
A B
L P
G M
H Kết quả: D N I B J O E K A F P L C M G
Trang 31Binary Tree - Duyệt cây nhị phân
Duyệt theo thứ tự giữa LRN (Left-Right-Node)
Kiểu duyệt này trước tiên 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
Thủ tục duyệt có thể trình bày đơn giản như sau:
37
void LRN ( Tree t) {
if (t != NULL ) {
LRN (t->pLeft);
LRN (t->pRight);
// Xử lý tương ứng t theo nhu cầu
} }
Trang 32Binary Tree - Duyệt cây nhị phân LRN38
A B
L P
G M
H Kết quả: N I D O J K E B P L F M G C A
Trang 34Binary Tree – Ứng dụng
Tính toán giá trị của biểu thức dựa trên cây biểu thức: duyệt cây theo thứ tự giữa:
40
Trang 35Trắc nghiệm
Give the binary tree with root A The
root has left child B and right child C
B has left child D and right child E
There are no other nodes in the tree.
Which of the following traversals yields ABCDE?
a) Inorder
b) Preorder
c) All of the others answers
d) None of the others answers
41
Trang 37Trắc nghiệm
The order in which the nodes of this tree would be visited by a pre-order traversal is
43
a) GCMBEJQDFKY b) BCDFEJKYQMG c) BCDEFGKJMYQ d) GCBEDFMJKQY
Trang 38Một cách biểu diễn cây nhị phân khác
44
Đôi khi, khi định nghĩa cây nhị phân, người
ta quan tâm đến cả quan hệ 2 chiều cha con chứ không chỉ một chiều như định nghĩa ở phần trên
Lúc đó, cấu trúc cây nhị phân có thể định nghĩa lại như sau:
Trang 39Một số thao tác trên cây
Trang 40Đếm số node
47
Trang 41Đếm số node
Thuật toán:
Nếu Tree rỗng, Số node (Tree) = 0
Ngược lại, Số node (Tree) = 1 + Số node (Tree.Left) + Số node (Tree.Right)
48
Trang 42Đếm số node lá
49
Trang 43Đếm số node lá
Thuật toán:
Nếu Tree rỗng, Số nút lá (Tree) = 0
Nếu Tree là nút lá, Số nút lá (Tree) = 1 +
Trang 44Tính chiều cao
51
Trang 45Tính chiều cao
Thuật toán:
Nếu Tree rỗng, Height(Tree) = 0
Ngược lại, Height(Tree) = 1 +
max(Height(Tree.Left),
Height(Tree.Right))
52
Trang 46Nội dung
53
Cấu trúc cây (Tree)
Cấu trúc cây nhị phân (Binary Tree)
Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)
Cấu trúc cây nhị phân tìm kiếm cân bằng
(AVL Tree)
Trang 47Binary Search Tree
Trong chương 6, chúng ta đã làm quen với một số cấu
trúc dữ liệu động Các cấu trúc này có sự mềm dẻo nhưng lại bị hạn chế trong việc tìm kiếm thông tin trên chúng (chỉ có thể tìm kiếm tuần tự)
Nhu cầu tìm kiếm là rất quan trọng Vì lý do này, người
ta đã đưa ra cấu trúc cây để thỏa mãn nhu cầu trên
Tuy nhiên, nếu chỉ với cấu trúc cây nhị phân đã định nghĩa ở trên, việc tìm kiếm còn rất mơ hồ
Cần có thêm một số ràng buộc để cấu trúc cây trở nên chặt chẽ, dễ dùng hơn
Một cấu trúc như vậy chính là cây nhị phân tìm kiếm
Trang 48Binary Search Tree - Định nghĩa
Cây nhị phân tìm kiếm (CNPTK) là cây nhị phân trong đó tại mỗi nút, khóa của 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
Nhờ ràng buộc về khóa trên CNPTK, việc tìm kiếm trở nên
Trang 49Binary Search Tree – Ví dụ
Trang 50Binary Search Tree – Ví dụ
Trang 51Binary Search Tree – Ví dụ
Trang 52Binary Search Tree – Biểu diễn
59
Cấu trúc dữ liệu của CNPTK là cấu trúc dữ liệu biểu diễn cây nhị phân nói chung
(???)
Thao tác duyệt cây trên CNPTK hoàn toàn
giống như trên cây nhị phân
Chú ý: khi duyệt theo thứ tự giữa, trình tự các nút duyệt qua sẽ cho ta một dãy các nút theo thứ tự tăng dần của khóa
Trang 53Binary Search Tree – Duyệt cây
60
25 10
35 32
50 41
Duyệt inorder: 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
Duyệt giữa trên CNPTK
Trang 54Binary Search Tree – Duyệt cây
61
25 10
35 32
50 41
Duyệt postorder: 1 5 6 3 13 12 20 18 10 32 35 29 41 50 37 25
Duyệt sau trên CNPTK
Trang 55Binary Search Tree – Duyệt cây
62
25 10
35 32
50 41
Duyệt preorder: 25 10 3 1 6 5 18 12 13 20 37 29 35 32 50 41
Duyệt trước trên CNPTK
Trang 56Binary Search Tree – Tìm kiếm
63
25 10
35 32
50 41
Tìm kiếm 13
Khác nhau Giống nhau Node gốc nhỏ hơn Node gốc lớn hơn
Tìm thấy Số node duyệt: 5
Tìm kiếm trên CNPTK
Trang 57Binary Search Tree – Tìm kiếm
64
25 10
35 32
50 41
Tìm kiếm 14
Khác nhau Node gốc nhỏ hơn Node gốc lớn hơn
Không tìm thấy Số node duyệt: 5
Tìm kiếm trên CNPTK
Trang 58Binary Search Tree – Tìm kiếm
if (T->data ==X)
return T;
if (T->data >X)
return searchNode (T->pLeft, X);
return searchNode (T->pRight, X);
}
return NULL ; }
Trang 59Binary Search Tree – Tìm kiếm
Trang 60Binary Search Tree – Tìm kiếm
67
Nhận xét:
Số lần so sánh tối đa phải thực hiện để tìm phần tử X là h, với h là chiều cao của cây
Như vậy thao tác tìm kiếm trên CNPTK có
n nút tốn chi phí trung bình khoảng O(log2n)
Trang 61Binary Search Tree – Thêm
68
Việc thêm một phần tử X vào cây phải bảo
đảm điều kiện ràng buộc của CNPTK
Ta có thể thêm vào nhiều chỗ khác nhau trên cây, nhưng nếu thêm vào một nút ngoài sẽ là tiện lợi nhất do ta có thể thực hiện quá
trình tương tự thao tác tìm kiếm
Khi chấm dứt quá trình tìm kiếm cũng chính
là lúc tìm được chỗ cần thêm
Cách thực hiện:
Tìm vị trí thêm (???)
Trang 62Binary Search Tree – Thêm
Thêm một phần tử vào cây:
Trang 636
4 1
3
Binary Search Tree – Thêm
Ví dụ tạo cây với dãy:
4, 6, 1, 2, 5, 7, 3
Trang 64Binary Search Tree – Thêm
65
Ví dụ tạo cây với dãy :
30, 12, 17, 49, 22, 65, 51, 56, 70, 68
Trang 66 Xác định độ sâu/chiều cao của cây
Tìm giá trị nhỏ nhất/lớn nhất trên cây
Tính tổng các giá trị trên cây
Đếm số nút có giá trị bằng x
Xuất các số nguyên tố trên cây
73
Trang 67Binary Search Tree – Hủy một phần tử có khóa X
Trang 68Binary Search Tree – Hủy một phần tử có
Trang 69Binary Search Tree – Hủy một phần tử có khóa X
Trường hợp 2: X chỉ có 1 con (trái hoặc phải)
Trước khi hủy X ta móc nối cha của X với con duy nhất của nó
Trang 70Binary Search Tree – Hủy một phần tử có
khóa X
Trường hợp 3: X có đủ 2 con :
Không thể hủy trực tiếp do X có đủ 2 con
Hủy gián tiếp:
Thay vì hủy X, ta sẽ tìm một phần tử thế mạng Y Phần tử này có tối đa một con
Thông tin lưu tại Y sẽ được chuyển lên lưu tại X
Sau đó, nút bị hủy thật sự sẽ là Y giống như 2 trường hợp đầu
Vấn đề: chọn Y sao cho khi lưu Y vào vị trí của X, cây vẫn là CNPTK
77
Trang 71Binary Search Tree – Hủy một phần tử có
khóa X
Cách chọn phần tử thế mạng:
Phần tử nhỏ nhất (trái nhất) trên cây con phải (của nút muốn xóa)
Phần tử lớn nhất (phải nhất) trên cây con trái (của nút muốn xóa)
Việc chọn lựa phần tử nào là phần tử thế
mạng phụ thuộc vào ý thích của người lập trình
Ở đây, ta sẽ chọn phần tử nhỏ nhất trên cây con phải làm phần tử thế mạng
78
Trang 72Binary Search Tree – Hủy một phần tử có khóa X
Trang 73Binary Search Tree – Hủy một phần tử có khóa X
80
Xóa 51
Trang 74Binary Search Tree – Hủy một phần tử có khóa X
81
Xóa 83
Trang 75Binary Search Tree – Hủy một phần tử có khóa X
82
Xóa 36
Trang 76Binary Search Tree – Hủy một phần tử có khóa X
83
Xóa nút gốc:
Trang 77Binary Search Tree – Hủy một phần tử có khóa X
84
Xóa nút gốc:
42 là thế mạng
Trang 78Binary Search Tree – Hủy một phần tử có khóa X
85
Kết quả xóa:
Trang 79Binary Search Tree – Hủy một phần tử có khóa X
86
Xóa gốc 42
Trang 80Binary Search Tree – Hủy một phần tử có khóa X
Xóa gốc 42
45 thế mạng
87
Trang 81Binary Search Tree – Hủy một phần tử có khóa X
88
Kết quả xóa:
Trang 82Binary Search Tree – Hủy một phần tử có khóa X
Các hàm dùng để hủy 1 phần tử:
Hàm delNode trả về giá trị 1, 0 khi hủy
thành công hoặc không có X trong cây:
int delNode (Tree &T, DataType X)
Hàm searchStandFor tìm phần tử thế mạng q
và gán dữ liệu của q cho nút muốn xóa p
void searchStandFor (Tree &p, Tree &q)
89
Trang 83if (T->data > X) return delNode (T->pLeft, X);
if (T->data < X) return delNode (T->pRight, X);
TNode * p = T;
if (T->pLeft == NULL ) T = T->pRight;
else if (T->pRight == NULL ) T = T->pLeft;
else // T có đủ 2 con
searchStandFor (p, T->pRight);
delete p;
}
Trang 84Binary Search Tree – Hủy một phần tử có khóa X
Tìm phần tử thế mạng (nhỏ nhất trên cây con phải):
p->data = q->data;
p = q;
q = q->pRight;
} }
Trang 85Binary Search Tree – Hủy toàn bộ cây
Việc toàn bộ cây có thể được thực hiện thông qua thao tác duyệt cây theo thứ tự sau Nghĩa là ta sẽ hủy cây con trái, cây con phải rồi mới hủy nút gốc
92
void removeTree ( Tree &T) {
if (T) {
removeTree (T->pLeft);
removeTree (T->pRight);
delete (T);
} }
Trang 86Binary Search Tree
93
Nhận xét:
Tất cả các thao tác searchNode , insertNode , delNode
đều có độ phức tạp trung bình O(h), với h là chiều cao của cây
Trong trong trường hợp tốt nhất, CNPTK có n nút sẽ
có độ cao h = log 2 (n) Chi phí tìm kiếm khi đó sẽ tương đương tìm kiếm nhị phân trên mảng có thứ tự
Trong trường hợp xấu nhất, cây có thể bị suy biến thành 1 danh sách liên kết (khi mà mỗi nút đều chỉ
có 1 con trừ nút lá) Lúc đó các thao tác trên sẽ
có độ phức tạp O(n)
Vì vậy cần có cải tiến cấu trúc của CNPTK để đạt được chi phí cho các thao tác là log 2 (n)
Trang 87 Nhập x, tìm giá trị nhỏ nhất trên cây mà lớn hơn x
Xuất số nguyên tố nhỏ nhất trên cây
Nhập x, tìm x trên cây, nếu tìm thấy x thì cho biết x có bao nhiêu con
Xóa 1 nút
94
Trang 88Nội dung
95
Cấu trúc cây (Tree)
Cấu trúc cây nhị phân (Binary Tree)
Cấu trúc cây nhị phân tìm kiếm (Binary Search Tree)
Cấu trúc cây nhị phân tìm kiếm cân bằng
(AVL Tree)
Trang 89Đánh giá tìm kiếm96
Trang 91Giới thiệu AVL Tree
Phương pháp chèn trên CNPTK có thể có những biến dạng mất cân đối nghiêm trọng
Chi phí cho việc tìm kiếm trong trường hợp xấu nhất đạt tới n
VD: 1 triệu nút ⇒ chi phí tìm kiếm = 1.000.000 nút
Nếu có một cây tìm kiếm nhị phân cân bằng hoàn
toàn, chi phí cho việc tìm kiếm chỉ xấp xỉ log2n
VD: 1 triệu nút ⇒ chi phí tìm kiếm = log 2 1.000.000 ≈
Trang 92AVL Tree - Định nghĩa
99
Cây nhị phân tìm kiếm cân bằng (AVL) là cây mà tại mỗi nút độ cao của cây con trái và của cây con phải chênh lệch không
Trang 93AVL Tree – Ví dụ
100
Trang 94AVL Tree
Chỉ số cân bằng của một nút:
Định nghĩa: Chỉ số cân bằng của một nút là hiệu của chiều cao cây con phải và cây con trái của nó
Đối với một cây cân bằng, chỉ số cân bằng (CSCB) của mỗi nút chỉ có thể mang một
trong ba giá trị sau đây:
CSCB(p) = 0 ⇔ Độ cao cây phải (p) = Độ cao cây trái (p)
CSCB(p) = 1 ⇔ Độ cao cây phải (p) > Độ cao cây trái (p)
CSCB(p) = -1 ⇔ Độ cao cây phải (p) < Độ cao cây trái (p)
101
Trang 95Ví dụ - Chỉ số cân bằng của nút
•What is the balance factor for each node in this AVL tree?
•Is this an AVL tree?
1 -1
0
0
-1 -1
1 0 0
Trang 96AVL Tree – Ví dụ103
Trang 97AVL Tree – Biểu diễn
104
#define RH 1 /* Cây con phải cao hơn */
#define EH 0 /* Hai cây con bằng nhau */
#define LH -1 /* Cây con trái cao hơn
Trang 98AVL Tree – Biểu diễn
105
Các thao tác đặc trưng của cây AVL:
Thêm một phần tử vào cây AVL
Hủy một phần tử trên cây AVL
Cân bằng lại một cây vừa bị mất cân bằng (Rotation)
Trường hợp thêm một phần tử trên cây AVL được thực
hiện giống như thêm trên CNPTK, tuy nhiên sau khi thêm phải cân bằng lại cây
Trường hợp hủy một phần tử trên cây AVL được thực hiện giống như hủy trên CNPTK và cũng phải cân bằng lại cây
Việc cân bằng lại một cây sẽ phải thực hiện sao cho chỉ ảnh hưởng tối thiểu đến cây nhằm giảm thiểu chi phí cân bằng
Trang 99AVL Tree - Các trường hợp mất cân bằng
Ta sẽ không khảo sát tính cân bằng của 1 cây nhị phân bất
kỳ mà chỉ quan tâm đến các khả năng mất cân bằng xảy ra khi chèn hoặc xóa một nút trên cây AVL
Trang 100AVL Tree - Các trường hợp mất cân bằng
Chèn nút vào cây AVL
1 và 4 là các ảnh đối xứng
2 và 3 là các ảnh đối xứng