! Cây và các ứng dụng của
cây
! Một số dạng cây thường
dùng: cây nhị phân, cây nhị
phân tìm kiếm, cây cân
bằng (AVL)
! Các thuật toán trên cây
! Đánh giá thuật toán
52 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 2682 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Cấu trúc cây - Trees, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 1
! Cây và các ứng dụng của
cây
! Một số dạng cây thường
dùng: cây nhị phân, cây nhị
phân tìm kiếm, cây cân
bằng (AVL)
! Các thuật toán trên cây
! Đánh giá thuật toán
Cấu trúc cây - Trees
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 2
Nội dung trình bày
! Các khái niệm và thuật ngữ cơ bản
! Tổng quan về cây nhị phân (Binary Tree)
! Cây nhị phân tìm kiếm (BST – Binary
Search Tree)
! Cây nhị phân tìm kiếm cân bằng (AVL
Tree)
2Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 3
Các khái niệm và thuật ngữ cơ bản
! Các ví dụ
! Định nghĩa cấu trúc cây
! Các thuật ngữ liên quan
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 4
Các khái niệm và thuật ngữ cơ bản
Các ví dụ
! Ví dụ 1: bài toán đưa thư
! Trên thế giới hiện có 6 tỉ người
! Tuấn, khoa CNTT, ĐH KHTN, Tp.HCM,
Việt nam
! Cách tìm ra “Tuấn” nhanh nhất ?
! Sử dụng mảng (array) ?
! Sử dụng danh sách liên kết (linked list) ?
3Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 5
Các khái niệm và thuật ngữ cơ bản
Các ví dụ
China
... ...
... ...Korea Vietnam
Trái đất
Tp.HCM Hà nội
ĐH.KHTN ĐH.BK
Khoa CNTT Khoa Toán
“Tuấn”
... ...
... ...
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 6
Các khái niệm và thuật ngữ cơ bản
Các ví dụ
! Ví dụ 2: cây biểu thức (a-b)*(c/d)
*
0 /
a b c d
4Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 7
Các khái niệm và thuật ngữ cơ bản
Các ví dụ
! Cây là 1 cấu trúc dữ liệu quan trọng để
biểu diễn tính “kế thừa”
! Các cây mô tả tính kế thừa:
! Cây gia phả (trong các dòng họ)
! Cây phân cấp các loài (trong sinh vật)
! …
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 8
Các khái niệm và thuật ngữ cơ bản
Định nghĩa cấu trúc cây
! Một cây (Tree) là:
! Một tập các phần tử, gọi là các nút (Node)
p1,p2,…,pN
! Nếu N=0, cây gọi là cây rỗng (NULL)
! Nếu N>0:
! Tồn tại duy nhất 1 nút pk gọi là gốc của cây
! Các nút còn lại được chia thành m tập không giao
nhau: T1, T2, …, Tm
! Mỗi là 1 cây con của cây
5Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 9
Các khái niệm và thuật ngữ cơ bản
Định nghĩa cấu trúc cây
a
b
k
i
g
c
h
e
f
d
j
Cây rỗng
(NULL)
Nút gốc
Cây
Cây con
Cây con
Cây con
Cây con
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 10
Các khái niệm và thuật ngữ cơ bản
Định nghĩa cấu trúc cây
a
c
k d
b
i h
j g e
f
Cây con
Cây con
Cây con
Cây con
Cây
6Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 11
Các khái niệm và thuật ngữ cơ bản
Định nghĩa cấu trúc cây
a
ck
dbi h
j g
ef
Cây con Cây con Cây con
Cây con
Cây
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 12
Các khái niệm và thuật ngữ cơ bản
Định nghĩa cấu trúc cây
! Các tính chất của cây:
! Nút gốc không có nút cha
! Mỗi nút khác chỉ có 1 nút cha
! Mỗi nút có thể có nhiều nút con
! Không có chu trình
7Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 13
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
! Nút (Node): là 1 phần tử trong cây. Mỗi nút có
thể chứa 1 dữ liệu bất kỳ
! Nhánh (Branch): là đoạn nối giữa 2 nút
! Nút cha (Parent node)
! Nút con (Child node)
! Nút anh em (sibling nodes): là những nút có cùng
nút cha
! Bậc của 1 nút pi: là số nút con của pi
! Bậc (a) = 4; Bậc (j) = 3; Bậc (g) = 2;
! Bậc (k) = 1; Bậc (c) = 0
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 14
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
! Nút gốc (Root node): nút không có nút cha
! Nút lá (Leaf node, hay nút ngoài – External
node): nút có bậc = 0 (không có nút con)
! Nút nội (Internal node): là nút có nút cha
và có nút con
! Cây con (Subtree)
! Trắc nghiệm: có bao nhiêu cây con trong cây
?
8Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 15
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
! Bậc của cây: là bậc lớn nhất của các nút
trong cây
! Bậc () = max {bậc (pi) / pi Î }
! Bậc của cây ?
! Đường đi (Path) giữa nút pi đến nút pj: là
dảy các nút liên tiếp từ pi đến pj sao cho
giữa hai nút kề nhau đều có nhánh
! Path(a, d) ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 16
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
! Mức (Level):
! Mức (p) = 0 nếu p = root
! Mức (p) = 1 + Mức (Cha (p)) nếu p!=root
! Chiều cao của cây (Height - hT): đường đi
dài nhất từ nút gốc đến nút lá
! hT = max {Path(root, pi) / pi là nút lá Î }
! hT ?
9Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 17
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 18
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
! Cây hoàn chỉnh (Complete tree) với h mức: là 1
cây thoả các điều kiện
! Những nút từ mức 0 đến mức h-1 đều đầy đủ
! Những nút ở mức h được thêm vào cây từ trái sang
phải
10
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 19
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
Cây hoàn chỉnh ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 20
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
Cây hoàn chỉnh ?
11
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 21
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
! Cây đầy đủ (Full tree): là 1 cây thoả
! Tất cả các nút lá đều nằm trên cùng 1 mức
! Tất cả những nút khác có cùng bậc với cây
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 22
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
Cây đầy đủ ?
12
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 23
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
Cây đầy đủ ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 24
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
Cây đầy đủ ?
13
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 25
Các khái niệm và thuật ngữ cơ bản
Các thuật ngữ liên quan
! Mức h của cây đầy đủ bậc d có dh nút
! VD. mức h=2 của cây bậc 3 có bao nhiêu nút ?
! h mức đầu tiên của cây đầy đủ bậc d có số nút
là:
! 1 + d + d2 + d3 + … + dh-1 = (dh - 1)/(d – 1)
! 3 mức đầu tiên của cây bậc 3 có bao nhiêu nút ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 26
Tổng quan về cây nhị phân
! Định nghĩa
! Cách thức lưu trữ cây
! Các phương pháp duyệt cây
14
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 27
Tổng quan về cây nhị phân
Định nghĩa
! Cây nhị phân là cây có bậc = 2
*
0 /
a b c d
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 28
Tổng quan về cây nhị phân
Định nghĩa
! Độ cao của cây nhị phân có N nút:
! hT(max) = N
! hT(min) = [log2N] + 1
15
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 29
Tổng quan về cây nhị phân
Định nghĩa
! Trắc nghiệm: Hãy vẽ tất cả các cây nhị
phân có 3 nút ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 30
Tổng quan về cây nhị phân
Cách thức lưu trữ cây
! Có 2 cách tổ chức cây nhị phân:
! Lưu trữ bằng mảng
! Lưu trữ bằng con trỏ cấu trúc
16
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 31
Tổng quan về cây nhị phân
Cách thức lưu trữ cây, sử dụng mảng
*
0 /
a b c d-1-1d6
-1-1c5
-1-1b4
-1-1a3
65/2
43-1
21*0
Con phảiCon tráiNút#
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 32
Tổng quan về cây nhị phân
Cách thức lưu trữ cây, sử dụng mảng
// Định nghĩa các cấu trúc dữ liệu
typedef struct tagBT_NODE {
int Data;
int Left; // chỉ số nút con trái
int Right; // chỉ số nút con phải
} BT_NODE; // binary tree node
BT_NODE tree[N]; // cây nhị phân có N nút
17
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 33
Tổng quan về cây nhị phân
Cách thức lưu trữ cây, sử dụng con trỏ
Nút gốc của
cây con trái
Data
pLeft pRight
pRoot Count
Nút gốc của
cây con phải
Data
pLeft pRight
Data
pLeft pRight
BT_NODE
BIN_TREE
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 34
Tổng quan về cây nhị phân
Cách thức lưu trữ cây, sử dụng con trỏ
// Định nghĩa các cấu trúc dữ liệu
typedef struct tagBT_NODE {
int Data;
tagBT_NODE *pLeft; // con trỏ đến nút con trái
tagBT_NODE *pRight; // con trỏ đến nút con phải
} BT_NODE; // binary tree node
18
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 35
Tổng quan về cây nhị phân
Cách thức lưu trữ cây, sử dụng con trỏ
// Định nghĩa các cấu trúc dữ liệu … (tiếp theo)
typedef struct BIN_TREE {
int Count; // Số nút trong cây
BT_NODE *pRoot; // con trỏ đến nút gốc
}; // binary tree
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 36
Tổng quan về cây nhị phân
Các phương pháp duyệt cây
! Có 3 cách duyệt cây:
! Duyệt gốc trước (Pre-Order) NLR
! Duyệt gốc giữa (In-Order) LNR
! Duyệt gốc sau (Post-Order) LRN
19
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 37
Tổng quan về cây nhị phân
Các phương pháp duyệt cây
void NLR(const BT_NODE
*pCurr)
{
if (pCurr==NULL) return;
“Xử lý nút gốc pCurr”
NLR(pCurr->pLeft);
NLR(pCurr->pRight);
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 38
Tổng quan về cây nhị phân
Các phương pháp duyệt cây
Minh họa cách
duyệt “gốc trước”
20
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 39
Tổng quan về cây nhị phân
Các phương pháp duyệt cây
void LNR(const BT_NODE
*pCurr)
{
if (pCurr==NULL) return;
LNR(pCurr->pLeft);
“Xử lý nút gốc pCurr”
LNR(pCurr->pRight);
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 40
Tổng quan về cây nhị phân
Các phương pháp duyệt cây
void LRN(const BT_NODE
*pCurr)
{
if (pCurr==NULL) return;
LRN(pCurr->pLeft);
LRN(pCurr->pRight);
“Xử lý nút gốc pCurr”
}
21
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 41
Tổng quan về cây nhị phân
Các phương pháp duyệt cây
! Trắc nghiệm:
! Cho biết kết quả duyệt cây biểu thức ở trang #27
theo mỗi cách NLR, LNR, LRN ?
! Viết thủ tục/hàm đếm số nút trong cây ?
! Viết thủ tục/hàm đếm số nút lá trong cây ?
! Viết thủ tục/hàm tính chiều cao của cây ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 42
Tổng quan về cây nhị phân
Các phương pháp duyệt cây
! Trắc nghiệm:
! Viết giải thuật duyệt
cây theo mức ?
22
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 43
Cây nhị phân tìm kiếm
(BST – Binary Search Tree)
! Ý nghĩa của cây BST
! Định nghĩa
! Ví dụ
! Mô tả cấu trúc dữ liệu
! Xây dựng các thao tác cơ bản trên cây
! Các đánh giá
! Trắc nghiệm
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 44
Cây nhị phân tìm kiếm
Ý nghĩa của cây BST
! Điểm yếu và điểm mạnh của việc sử dụng
mảng ?
! Điểm yếu và điểm mạnh của việc sử dụng
danh sách liên kết ?
! Cần có 1 cấu trúc tổng hợp được điểm
mạnh của cả mảng và danh sách liên kết.
! Trong cây nhị phân, chi phí để tìm kiếm 1
phần tử ?
23
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 45
Cây nhị phân tìm kiếm
Định nghĩa
! Cây nhị phân tìm kiếm là:
! Một cây nhị phân
! Mỗi nút p của cây đều thỏa:
! Tất cả các nút thuộc cây con trái (p->pLeft) đều
có giá trị nhỏ hơn giá trị của p
"q Î p->pLeft: q->Data Data
! Tất cả các nút thuộc cây con phải (p->pRight)
đều có giá trị lớn hơn giá trị của p
"q Î p->pRight: q->Data > p->Data
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 46
Cây nhị phân tìm kiếm
Ví dụ
24
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 47
Cây nhị phân tìm kiếm
Ví dụ
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 48
Cây nhị phân tìm kiếm
Mô tả cấu trúc dữ liệu
! Cách lưu trữ cây BST giống như cây nhị
phân
! Xem lại phần “Tổng quan về cây nhị phân
- Cách thức lưu trữ cây”
25
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 49
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Các thao tác trên cây BST:
! Tạo lập cây rỗng
! Kiểm tra cây rỗng
! Tìm kiếm 1 phần tử
! Thêm 1 phần tử
! Xóa 1 phần tử
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 50
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Tạo lập cây rỗng:
void BSTCreate(BIN_TREE &t)
{
t.Count = 0; // Số nút trong cây
t.pRoot = NULL; // Con trỏ đến nút gốc
}
26
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 51
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Kiểm tra cây rỗng:
int BSTIsEmpty(const BIN_TREE &t)
{
if (t.pRoot==NULL) return 1;
return 0;
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 52
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ tìm kiếm phần tử 25:
40
6532
24 36
30
254 70
75
pRoot
27
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 53
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ tìm kiếm phần tử “Nancy”:
Jane
TomBob
Alan Ellen WendyNancy
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 54
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ tìm kiếm phần tử 31:
40
6532
24 36
30
254 70
75
pRoot
NULL, không tìm thấy
28
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 55
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Tìm kiếm 1 phần tử:
BT_NODE *BSTSearch(const BT_NODE *pCurr, int Key)
{
if (pCurr==NULL) return NULL; // Không tìm thấy
if (pCurr->Data==Key) return pCurr; // Tìm thấy
else if (pCurr->Data > Key) // Tìm trong cây con trái
return BSTSearch(pCurr->pLeft, Key);
else // Tìm trong cây con phải
return BSTSearch(pCurr->pRight, Key);
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 56
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ thêm phần tử “Frank”:
Jane
TomBob
Alan Ellen WendyNancy
NULL, kết thúc tìm
kiếm ở đây
29
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 57
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
Jane
TomBob
Alan Ellen WendyNancy
Frank
! Ví dụ thêm
phần tử
“Frank”:
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 58
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
40
6532
24 36
30
274 70
75
pRoot! Ví dụ thêm phần tử 26:
NULL, kết thúc tìm
kiếm ở đây
30
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 59
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
40
6532
24 36
30
274 70
75
pRoot
26
! Ví dụ thêm phần tử 26:
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 60
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
40
6532
24 36
30
274 70
75
pRoot! Ví dụ thêm phần tử 27:
Tìm thấy,
không thêm nữa
31
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 61
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Thêm 1 phần tử:
int BSTInsert(BT_NODE *&pCurr, int newKey)
{ if (pCurr==NULL) {
pCurr = new BT_NODE; // Tạo 1 nút mới
pCurr->Data = newKey; pCurr->pLeft = pCurr->pRight = NULL;
return 1; // Thêm thành công
}
if (pCurr->Data > newKey) // Thêm vào cây con trái
return BSTInsert(pCurr->pLeft, newKey);
else if (pCurr->Data < newKey) // Thêm vào cây con phải
return BSTInsert(pCurr->pRight, newKey);
else return 0; // Trùng khóa, không thêm nữa
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 62
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Thao tác xóa 1 phần tử:
! Áp dụng giải thuật tìm kiếm để xác định nút
chứa phần tử cần xóa
! Nếu tìm thấy, xóa phần tử đó khỏi cây
! Các trường hợp xảy ra:
! Xóa 1 nút không có nút con
! Xóa 1 nút có 1 nút con
! Xóa 1 nút có 2 nút con
32
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 63
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ xóa phần tử 4 (không có nút con)
75
40
6532
24 36
30
254 70
40
6532
24 36
30
25 70
75
Gán liên kết ở nút
cha thành NULL
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 64
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ xóa phần tử 25 (chỉ có nút con phải)
75
40
6532
24 36
30
25 70 30
40
6532
24 36
70
75
liên kết = nút con phải
33
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 65
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
Trước khi xóa pCurr Sau khi xóa pCurr
P->pLeft = pCurr->pRight;
delete pCurr;
! Xoá 1 nút chỉ có nút con phải:
L
L
pCurr
PP
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 66
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Ví dụ xóa phần tử 75 (chỉ có nút con trái)
75
40
6532
24 36
30
25 70
70
40
6532
24 36
30
25
liên kết =
nút con trái
34
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 67
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
Trước khi xóa pCurr Sau khi xóa pCurr
P->pRight = pCurr->pLeft;
delete pCurr;
! Xoá 1 nút chỉ có nút con trái:
L
L
pCurr
PP
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 68
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
75
40
6532
24 36
30
254 70
! Ví dụ xóa phần tử 40 (có 2 nút con)
35
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 69
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
36 75
40
6532
24
30
254 70
36
! Xóa phần tử 40 (có 2 nút con):
Cách 1: thay thế
bằng phần tử lớn
nhất trong cây con
bên trái
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 70
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
36 75
40
6532
24
30
254 70
65
! Xóa phần tử 40 (có 2 nút con):
Cách 2: thay thế
bằng phần tử nhỏ
nhất trong cây con
bên phải
36
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 71
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Xóa 1 phần tử pCurr có 2 nút con:
! Thay vì xóa trực tiếp nút pCurr…
! …ta tìm 1 phần tử thay thế p,
! …copy nội dung của p sang pCurr,
! …xóa nút p.
! Phần tử thay thế p:
! là phần tử lớn nhất trong cây con bên trái; hoặc…
! …là phần tử nhỏ nhất trong cây con bên phải
à phần tử p có nhiều nhất là 1 nút con
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 72
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Xóa 1 phần tử:
int BSTDelete(BT_NODE *&pCurr, int Key)
{ if (pCurr==NULL) return 0; // Không tìm thấy phần tử
if (pCurr->Data > Key) // Xóa trên cây con trái
return BSTDelete(pCurr->pLeft, Key);
else if (pCurr->Data < Key) // Xóa trên cây con phải
return BSTDelete(pCurr->pRight, Key);
// Tìm thấy nút cần xóa pCurr à Xóa !
_Delete(pCurr);
return 1;
}
37
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 73
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Xóa 1 phần tử (tt)…:
void _Delete(BT_NODE *&pCurr)
{
BT_NODE *pTemp = pCurr;
if (pCurr->pRight==NULL) // Chỉ có 1 nút con trái
pCurr = pCurr->pLeft; // Lưu lại nhánh con trái
else if (pCurr->pLeft==NULL)
pCurr = pCurr->pRight; // Lưu lại nhánh con phải
else // Có 2 nhánh con
pTemp = _SearchStandFor(pCurr->pLeft, pCurr);
delete pTemp;
}
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 74
Cây nhị phân tìm kiếm
Xây dựng các thao tác cơ bản trên cây
! Xóa 1 phần tử (tt)…:
// Tìm phần tử thay thế: “Phần tử lớn nhất trong cây con bên trái”
BT_NODE * _SearchStandFor(BT_NODE *&p, BT_NODE *pCurr)
{
if (p->pRight != NULL)
return _SearchStandFor(p->pRight, pCurr);
// Tìm thấy phần tử thay thế…
pCurr->Data = p->Data; // Copy dữ liệu của p vào pCurr
BT_NODE *pTemp = p;
p = p->pLeft; // Lưu lại nhánh con trái
return pTemp; // Xóa phần tử thay thế
}
38
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 75
Cây nhị phân tìm kiếm
Các đánh giá
! Cây có N nút sẽ có độ cao trong khoảng từ
[log2(N+1)] đến N
! Trắc nghiệm: khi nào độ cao của cây nhỏ nhất ? Lớn
nhất ?
! So sánh giữa cây BST với mảng được sắp thứ tự:
! Có cùng chi phí tìm kiếm O(log2N)
! Cây BST có chi phí thêm 1 phần tử O(log2N); mảng có
chi phí thêm 1 phần tử O(N)
! Tương tự đối với thao tác xóa 1 phần tử
! Cây BST tốn nhiều bộ nhớ lưu trữ hơn
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 76
Cây nhị phân tìm kiếm
Trắc nghiệm
! Viết hàm “Tìm phần tử thay thế: Phần tử nhỏ
nhất trong cây con bên phải”
! Bài tập #20
! Bài tập #22
! Bài tập #36
! Bài tập #31
39
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 77
Cây nhị phân tìm kiếm cân bằng
(AVL Tree)
! Vì sao phải cân bằng ?
! Định nghĩa
! Ví dụ
! Mô tả cấu trúc dữ liệu
! Thao tác điều chỉnh cây
! Ví dụ tạo cây
! Các đánh giá
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 78
AVL Tree
Vì sao phải cân bằng ?
! Cây BST có thể không cân bằng
Tom
Nancy
Alan
Bob
Ellen
Jane
Wendy
Cây bị lệch
à Chi phí O(N)
Trường hợp nào cây
BST trở nên bị lệch ?
Cần có 1 phương
pháp để duy trì độ cân
bằng cho cây !
40
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 79
AVL Tree
Vì sao phải cân bằng ?
! Cây AVL là 1 dạng cây BST cân bằng
! Cấu trúc cây AVL do 3 tác giả: Adelson,
Velskii, Landis đề xuất năm 1962
! Đây là mô hình cây cân bằng động đầu tiên
được đề xuất
! Cây AVL không có độ cân bằng “tuyệt
đối”, nhưng 2 cây con không bao giờ có độ
cao chênh lệch quá 1.
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 80
AVL Tree
Định nghĩa
! Cây AVL là:
! Một cây nhị phân tìm kiếm
! Mỗi nút p của cây đều thỏa: độ cao của cây
con bên trái (p->pLeft) và độ cao của cây con
bên phải (p->pRight) chênh lệch nhau không
quá 1
"pÎTAVL: abs(hp->pLeft - hp->pRight)£ 1
41
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 81
AVL Tree
Ví dụ
Cây AVL ?
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 82
AVL Tree
Mô tả cấu trúc dữ liệu
! Thêm vào mỗi nút trong cây 1 field Bal,
diễn tả trạng thái của nút đó:
! Bal = -1: nút lệch trái (cây con trái cao hơn
cây con phải)
! Bal = 0: nút cân bằng (cây con trái cao bằng
cây con phải)
! Bal = +1: nút lệch phải (cây con phải cao hơn
cây con trái)
42
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 83
AVL Tree
Mô tả cấu trúc dữ liệu
10
20
30
15 4026
2725
1
0
-1
0
1
0
0
0
Hệ số cân
bằng của
các nút
trong cây
AVL
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 84
AVL Tree
Mô tả cấu trúc dữ liệu
Nút gốc của
cây con trái
pRoot Count
Nút gốc của
cây con phảiAVLT_NODE
AVL_TREE
Data Bal
pLeft pRight
Data Bal
pLeft pRight
Data Bal
pLeft pRight
43
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 85
AVL Tree
Mô tả cấu trúc dữ liệu
// Định nghĩa các cấu trúc dữ liệu
typedef struct tagAVLT_NODE {
int Data;
int Bal; // Hệ số cân bằng (-1,0,1)
tagBT_NODE *pLeft; // con trỏ đến nút con trái
tagBT_NODE *pRight; // con trỏ đến nút con phải
} AVLT_NODE; // Cấu trúc nút của cây AVL
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 86
AVL Tree
Mô tả cấu trúc dữ liệu
// Định nghĩa các cấu trúc dữ liệu … (tiếp theo)
typedef struct AVL_TREE {
int Count; // Số nút trong cây
AVLT_NODE *pRoot; // con trỏ đến nút gốc
}; // Cấu trúc cây AVL
44
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 87
AVL Tree
Thao tác điều chỉnh cây
! [Insert – Thêm 1 phần tử vào cây]: có thể
làm cây mất cân bằng.
! Ta duyệt từ nút vừa thêm ngược về nút gốc, …
! …nếu tìm ra 1 nút P bị mất cân bằng, …
! …thì tiến hành điều chỉnh lại cây tại nút P
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 88
AVL Tree
Thao tác điều chỉnh cây
! Ví dụ: thêm
phần tử làm
cây mất cân
bằng tại nút
P
44
17 78
32 50 88
48 62
54
P
45
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 89
AVL Tree
Thao tác điều chỉnh cây
! [Delete – Xóa 1 phần tử]: có thể làm cây
mất cân bằng.
! Ta duyệt từ nút vừa xóa ngược về nút gốc, …
! …nếu tìm ra 1 nút P bị mất cân bằng, …
! …thì tiến hành điều chỉnh lại cây tại nút P
! Thao tác điều chỉnh có thể làm cho những nút
phía trên nút P bị mất cân bằng à cần điều
chỉnh cho đến khi không còn nút nào bị mất
cân bằng nữa
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 90
AVL Tree
Thao tác điều chỉnh cây
! Ví dụ: xóa
phần tử làm
cây mất cân
bằng tại nút
P
44
17 78
50 88
48 62
P
32
46
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 91
AVL Tree
Thao tác điều chỉnh cây
Những trường hợp cây bị mất cân bằng và
Các cách điều chỉnh cây
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 92
AVL Tree
Thao tác điều chỉnh cây
(a) (b)
Hai trường hợp cây bị mất cân bằng ở nhánh trái
P
P1
A B
C
-1
h
h
h+1
-1
h
P
P1
B
A
C h
h+1
-1
+1
47
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 93
AVL Tree
Thao tác điều chỉnh cây
Trường hợp (a): áp dụng phép xoay đơn Trái - Phải
(LR – Single Left-Right)
P
P1
A
C
P
P1
A B
C
-1
h
h
h+1
-1
B
LR
hhh+1
0
0
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 94
AVL Tree
Thao tác điều chỉnh cây
Ví dụ: thao tác xoay đơn LR
44
17 78
32 50 88
48 62
46
P
P1
LR
P
44
17 50
32 7848
6246
P1
88
48
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 95
AVL Tree
Thao tác điều chỉnh cây
h
P
P1
B
A
C h
h+1
-1
+1
LR
Trường hợp (b): thử áp dụng phép xoay đơn LR ?
P
P1
A
CB
hh+1h
Mất CB
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 96
AVL Tree
Thao tác điều chỉnh cây
Phép xoay kép Trái - Phải
(DLR – Double Left – Right)
A
h
P
P1
B1
C h
-1
+1
P2
B2
Trường hợp (b)
49
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 97
AVL Tree
Thao tác điều chỉnh cây
A
h
P
P1
B1
C h
-1
+1
P2
B2
DLR
Trường hợp (b): áp dụng phép xoay kép Trái - Phải
(DLR)
A
PP1
B1 C
h h
0P2
B2
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 98
AVL Tree
Thao tác điều chỉnh cây
Ví dụ: thao tác xoay kép DLR
44
17 78
32 50 88
48 62
54
P1
P
P2
44
17
32 50 78
48 8854
62
P1
P2
P
DLR
50
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 99
AVL Tree
Thao tác điều chỉnh cây
(a) (b)
Hai trường hợp cây bị mất cân bằng ở nhánh phải
P
A
+1
h
h
P1
C
B h+1
+1
P
A
+1
h
h+1
P1
CB
h
+1
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 100
AVL Tree
Thao tác điều chỉnh cây
Phương pháp xử lý cho trường hợp mất
cân bằng ở nhánh phải: tương tự như các xử lý
mất cân bằng ở nhánh trái.
51
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 101
AVL Tree
Ví dụ tạo cây
! Tạo cây AVL với các khóa lần lượt là:
30, 20, 10,…
10
20
30
LR 10
20
30
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 102
AVL Tree
Ví dụ tạo cây
10
20
30
15 4025
27
26
DRL
10
20
30
15 4026
2725
…thêm 15, 40, 25, 27, 26
52
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 103
AVL Tree
Ví dụ tạo cây
…thêm 5, 13, 14
5
10
20
30
15 4026
272513
14
DLR
10
20
30
14 4026
2725
5
13 15
Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 104
AVL Tree
Các đánh giá
! Độ cao của cây: hAVL < 1.44log2(N+1). Cây AVL
có độ cao nhiều hơm 44% so với độ cao của 1 cây
nhị phân tối ưu.
! Chi phí tìm kiếm O(log2N)
! Chi phí thêm phần tử O(log2N)
! Tìm kiếm: O(log2N)
! Điều chỉnh cây: O(log2N)
! Chi phí xóa phần tử O(log2N)
! Tìm kiếm: O(log2N)
! Điều chỉnh cây: O(log2N)
Các file đính kèm theo tài liệu này:
- Cấu trúc cây - Trees.pdf