GV : Văn Thị Thiên Trang
Khoa : Công Nghệ Thông Tin
CẤU TRÚC DỮ LIỆU
& GiẢI THUẬT
1
MÔ TẢ HỌC PHẦN
- Tìm hiểu các phương pháp tổ chức và
những thao tác cơ sở trên từng CTDL, kết
hợp với việc phát triển tư duy giải thuật để
hình thành nên chương trình máy tính.
- Giúp học viên hiểu được tầm quan trọng
của giải thuật và cách tổ chức dữ liệu, là hai
thành tố quan trọng nhất cho một chương
trình.
- Giúp học viên củng cố và phát triển kỹ năng
lập trình được học trong giai đoạn trước.
GV. Văn Thị Thiên Trang 2
NỘI DUNG HỌC PHẦN
- Bài 1. Tổng quan về cấu trúc dữ liệu và giải thuật
- Bài 2. Tìm kiếm.
- Bài 3. Sắp xếp.
- Bài 4. Danh sách.
- Bài 5. Cấu trúc Stack.
- Bài 6. Cấu trúc Queue.
- Bài 7. Cấu trúc cây, cây nhị phân.
- Bài 8. Cây nhị phân tìm kiếm - BST.
- Bài 9. Cây nhị phân tìm kiếm cân bằng - cây AVL.
GV. Văn Thị Thiên Trang 3
Bài 1. TỔNG QUAN VỀ CTDL & GT
Nội dung
1.1. Vai trò CTDL trong một đề án tin học
1.2. Các tiêu chuẩn đánh giá CTDL
1.3. Trừu tượng hóa dữ liệu
1.4. Kiểu dữ liệu cơ bản
1.5. Kiểu dữ liệu có cấu trúc
1.6. Độ phức tạp của giải thuật
GV. Văn Thị Thiên Trang 4
1.1. Vai trò CTDL trong 1 đề án tin học
Bài toán giải quyết
trong máy tính
Xử lý trên
đối tượng DL
Bài toán thực tế
Đối tượng
dữ liệu
GV. Văn Thị Thiên Trang 5
1.1. Vai trò CTDL trong 1 đề án tin học
• Dữ liệu thực tế:
– Muôn hình vạn trạng, đa dạng, phong phú
– Thường có chứa đựng quan hệ với nhau
• Cần phải tổ chức biểu diễn thành cấu trúc
thích hợp nhất
– Phản ánh chính xác dữ liệu thực tế
– Dễ dàng xử lý trong máy tính
Xây dựng
CTDL
GV. Văn Thị Thiên Trang 6
1.1. Vai trò CTDL trong 1 đề án
tin học
Xây dựng thao tác xử lý
Dựa trên Y/C cụ thể, xác định các trình tự giải
quyết vấn đề trên máy tính để đưa kết quả
mong muốn
Đối tượng DL
Thao tác xử lý Kết quả
mong muốn
Xây dựng giải
thuật
GV. Văn Thị Thiên Trang 7
1.1. Vai trò CTDL trong 1 đề án
tin học
Giải thuật
Chương trình
Cấu trúc dữ liệu
Quan hệ chặt chẽ
GV. Văn Thị Thiên Trang 8
1.2. Các tiêu chuẩn đánh giá CTDL
• Phản ánh đúng thực tế:
– Thể hiện được đầy đủ thông tin nhập/xuất
của bài toán.
• Phù hợp với thao tác xử lý:
– Tăng tính hiệu quả của chương trình  hiệu
quả của dự án tin học.
• Tiết kiệm tài nguyên hệ thống:
– Sử dụng tài nguyên vừa đủ để thực hiện chức
năng & nhiệm vụ.
GV. Văn Thị Thiên Trang 9
1.3. Trừu tượng hóa dữ liệu
• Trừu tượng hoá
– Làm đơn giản hóa, sáng sủa, dễ hiểu hơn.
– Che đi phần chi tiết, làm nổi bật cái tổng thể
• Trừu tượng hoá dữ liệu: đưa ra các kiểu dữ liệu
trừu tượng (Abstract Data Type)
• ADT: gồm
– Mô tả dữ liệu
– Tác vụ liên quan
• VD: tập số nguyên với các phép toán hợp, giao,
hiệu là kiểu dữ liệu trừu tượng.
GV. Văn Thị Thiên Trang 10
1.3. Trừu tượng hóa dữ liệu
• VD: mô tả kiểu dữ liệu trừu tượng về số hữu tỉ a/b với các tác
vụ: +,*, /
– Mô tả dữ liệu
• Tử số
• Mẫu số (≠0)
– Mô tả tác vụ
Cộng(Số_Hữu_Tỉ 1, Số_Hữu_Tỉ 2)
• Nhập:
– a, b là tử số và mẫu số của Số_Hữu_Tỉ 1
– c, d là tử số và mẫu số của Số_Hữu_Tỉ 2
• Xuất:
– ad+bc là tử số của số hữu tỉ kết quả
– bd là mẫu số của số hữu tỉ kết quả
GV. Văn Thị Thiên Trang 11
1.4. Kiểu dữ liệu cơ bản
• Thường đơn giản và không có cấu trúc, được NNLT
xây dựng sẵn, nên còn gọi là kiểu dữ liệu dựng sẵn.
• Thường là các trị vô hướng:
– số nguyên
– số thực
– ký tự
– giá trị logic
GV. Văn Thị Thiên Trang 12
1.4. Kiểu dữ liệu cơ bản (tt)
Tên kiểu KT Miền giá trị Ghi chú
char 1 -128 đến 127 Có thể dùng như số nguyên 1
byte có dấu hay kiểu ký tự
unsigned char 1 0 đến 255 Số nguyên 1 byte ko dấu
int 2 -32768 đến 32767
unsigned int 2 0 đến 65355 Gọi tắt là unsigned
long 4 -232 đến 231 -1
unsigned long 4 0 đến 232 -1
float 4 3.4E-38 … 3.4E38 Giới hạn chỉ trị tuyệt đối.Các
giá trị <3.4E-38 được coi = 0.
Tuy nhiên kiểu float chỉ có 7
chữ số có nghĩa.
double 8 1.7E-308 … 1.7E308
long double 10 3.4E-4932 …1.1E4932
GV. Văn Thị Thiên Trang 13
1.5. Kiểu dữ liệu có cấu trúc
• Kết hợp nhiều kiểu dữ liệu cơ bản để phản ánh
bản chất của đối tượng thực tế
• Đa số các ngôn ngữ đều cài đặt sẵn một số kiểu
có cấu trúc cơ bản: mảng, chuỗi, tập tin, bản
ghi…
• Ngoài ra cung cấp cơ chế cho người lập trình
cài đặt các dữ liệu cấu trúc khác.
GV. Văn Thị Thiên Trang 14
1.5. Kiểu dữ liệu có cấu trúc
• Cấu trúc dữ liệu Sinh viên
Mã SV: chuỗi kt
Tên SV: chuỗi
kt
Ngày sinh: ngày tháng
Nơi sinh: chuỗi kt
Điểm thi: số thực
Sinh Viên
GV. Văn Thị Thiên Trang 15
1.6. Độ phức tạp của giải thuật
• Sự cần thiết phân tích giải thuật
GT A
GT B
GT C
Vấn đề cần giải quyết
GT tốt
1. Giải thuật đúng
2. Giải thuật đơn giản
3. Giải thuật thực hiện nhanh
GV. Văn Thị Thiên Trang 16
1.6. Độ phức tạp của giải thuật
• Các độ phức tạp thường gặp:
– O(1) : Nếu T(n) là hằng số (T(n)=C)
– O(log2n) : Độ phức tạp dạng logarit
– O( n) : Độ phức tạp tuyến tính
– O(nlog2n): Độ phức tạp tuyến tính logarit
– O( n2), O(n3),…,O(n ): Độ phức tạp đa thức
– O(n!), O( nn)
• Thông thường thuật giải có độ phức tạp đa
thức thì có thể cài đặt
• Độ phức tạp ở mức hàm mũ thì phải cải tiến
giải thuật!
GV. Văn Thị Thiên Trang 17
1.6. Độ phức tạp của giải thuật
• Thường dựa vào số phép so sánh và số phép gán
• Một số công thức thường dùng
n
n
i


1
1 1
1
1
1
1
1




 

 


a
b
a
i
b
i
b
a
i
2
)
1
(
1




n
n
i
n
i 2
)
1
(
)
1
( a
a
n
n
i
n
a
i






2
)
1
( 2
2
1
2




n
n
i
n
i
6
)
1
2
)(
1
(
1
2 




n
n
n
i
n
i
4
)
1
( 2
2
1
3 



n
n
i
n
i
GV. Văn Thị Thiên Trang 18
CÂU HỎI ÔN TẬP BÀI 1
1. Viết chương trình C khai báo kiểu dữ liệu là mảng một chiều,
chương trình có các chức năng như sau:
– Nhập giá trị vào mảng.
– Xuất các phần tử trong mảng.
2. Viết chương trình C có khai báo kiểu dữ liệu là mảng hai chiều,
chương trình có các chức năng sau:
– Nhập giá trị vào ma trận.
– Xuất các phần tử trong ma trận.
3. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng cho thông tin
sinh viên với các thao tác nhập, xuất thông tin của sinh viên.
4. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng của số hữu tỉ
a/b với các tác vụ cộng hai số hữu tỉ, nhân hai số hữu tỉ, chia hai
số hữu tỉ.
GV. Văn Thị Thiên Trang 19
Bài 2. TÌM KIẾM
• Nội dung
2.1. Giới thiệu bài toán tìm kiếm
2.2. Tìm kiếm tuyến tính
2.3. Tìm kiếm nhị phân
GV. Văn Thị Thiên Trang 20
2.1. Giới thiệu bài toán tìm kiếm
• Tìm kiếm là quá trình xác định một đối tượng nào đó
trong một tập các đối tượng. Kết quả trả về:
– Đối tượng tìm được (nếu có)
– Chỉ số (nếu có) xác định vị trí của đối tượng trong tập đó.
• Việc tìm kiếm dựa theo một trường nào đó của đối
tượng, trường này là khóa (key) của việc tìm kiếm.
– VD: Tìm sinh viên có họ tên X trong DSSV.
• SV {MaSV, HoTen, DiaChi,…}
• Khoá?
• Kết quả trả về?
GV. Văn Thị Thiên Trang 21
2.1. Giới thiệu bài toán tìm kiếm
• Bài toán được mô tả như sau:
– Tập dữ liệu được lưu trữ là dãy a1, a2,..,an. Giả sử
chọn cấu trúc dữ liệu mảng để lưu trữ dãy số này
trong bộ nhớ chính, có khai báo: int a[n];
– Khóa cần tìm là x: int x;
Tìm kiếm
Tìm kiếm tuyến tính Tìm kiếm nhị phân
Tập dữ liệu đã
được sắp xếp
Tập dữ liệu
bất kỳ
GV. Văn Thị Thiên Trang 22
2.1. Giới thiệu bài toán tìm kiếm
• Ý tưởng: duyệt tuần tự từ phần tử đầu tiên, lần lượt so
sánh khóa tìm kiếm với khoá tương ứng của các phần
tử trong danh sách. Cho đến khi gặp phần tử cần tìm
hoặc đến khi duyệt hết danh sách.
• Các bước tiến hành như sau:
i = 0
a[i] = x
i = i + 1
i<n Không tìm thấy
Tìm thấy
Đ
Đ
S
S
GV. Văn Thị Thiên Trang 23
1.1 Tìm kiếm tuyến tính
• Ví dụ: Cho dãy số a, giá trị tìm X = 8:
12 2 5 8 1 6 4
12 2 5 8 1 6 4
X = 8
Tìm thấy
12 2 5 8 1 6 4
X = 7
Không tìm thấy
i=0 i=1 i=2 i=3 i=4 i=5 i=6
i=0 i=1 i=2 i=3 i=4 i=5 i=6
GV. Văn Thị Thiên Trang 24
1.1 Tìm kiếm tuyến tính
• Thuật toán tìm kiếm tuyến tính
/* Trả về: vị trí xuất hiện đầu tiên của x trong mảng a
Trả về: -1 nếu x không có trong mảng a */
int Search(int a[], int n, int key)
{
int i =0;
while (i<n && key != a[i])
i++;
if (i < n)
return i; // tìm thấy tại vị trí i
return -1; // tìm không thấy
}
GV. Văn Thị Thiên Trang 25
1.1 Tìm kiếm tuyến tính
• Thuật toán tìm kiếm tuyến tính cải tiến
int Search(int a[], int n, int key)
{
int i =0;
a[n] =key; // thêm phần tử thứ n+1
while (key != a[i])
i++;
if (i == n)
return -1; // tìm hết mảng nhưng không có x
return i; // tìm thấy x tại vị trí i
}
GV. Văn Thị Thiên Trang 26
Nhận xét
• Giải thuật tìm kiếm tuyến tính không phụ thuộc vào thứ tự của
các phần tử trong mảng, do vậy đây là phương pháp tổng
quát nhất để tìm kiếm trên một dãy bất kỳ
• Một thuật toán có thể được cài đặt theo nhiều cách khác
nhau, kỹ thuật cài đặt ảnh hưởng nhiều đến tốc độ thực hiện.
Ví dụ như thuật toán Search cải tiến sẽ chạy nhanh hơn thuật
toán trước do vòng lặp while chỉ so sánh một điều kiện...
GV. Văn Thị Thiên Trang 27
1.2 Tìm kiếm nhị phân
• Phép tìm kiếm nhị phân được áp dụng
trên dãy khóa đã có thứ tự: k[1]  k[2]  ...
 k[n].
GV. Văn Thị Thiên Trang 28
1.2 Tìm kiếm nhị phân
• Giả sử ta cần tìm trong đoạn a[left,..,right] với khóa tìm kiếm
là X
• Chia đôi phạm vi tìm kiếm mid=(left+right)/2.
• Xét phần tử giữa là a[mid]:
– Nếu a[mid]=X: Tìm thấy tại vị trí mid.
– Nếu a[mid]<X:
• Đoạn a[left,..,mid] chứa các phần tử <X
• Tìm X trong đoạn a[mid+1,.., right]
– Nếu a[mid]>X:
• Đoạn a[mid,..,right] chứa các phần tử >X
• Tìm X trong đoạn a[left,.., right-1]
• Quá trình tìm kiếm thất bại nếu left>right
GV. Văn Thị Thiên Trang 29
1.2 Tìm kiếm nhị phân
• Cho dãy số gồm 8 phần tử bên dưới và X
= 8:
1 2 4 5 6 8 12 15
1 2 4 5 6 8 12 15
Left = 0
X = 8
Right = 7
Mid = 3
1 2 4 5 6 8 12 15
Left = 4
X = 8
Right = 7
Mid = 5
Đoạn tìm kiếm
Đoạn tìm kiếm
=
<
GV. Văn Thị Thiên Trang 30
1.2 Tìm kiếm nhị phân
int BinarySearch(int a[], int n, int key){
int left = 0, right = n-1, mid;
while (left <= right){
mid = (left + right)/ 2; // lấy điểm giữa
if (a[mid] == key) // nếu tìm được
return mid;
if (a[mid] < key) // tìm đoạn bên phải mid
left = mid+1;
else
right = mid-1; // tìm đoạn bên trái mid
}
return -1; // không tìm được
}
GV. Văn Thị Thiên Trang 31
CÂU HỎI ÔN TẬP BÀI 2
1. Sinh mảng ngẫu nhiên gồm N số nguyên có giá trị  (-
100, 100)
– Tìm phần tử có giá trị X trong mảng bằng 2 phương pháp: Tìm
tuần tự và tìm nhị phân
2. Cho cấu trúc Sách (Mã sách: char[10], Tên sách:
char[40], Giá: long). Viết chương trình thực hiện:
– Nhập, xuất danh sách gồm N cuốn sách.
– Tìm cuốn sách có mã là X bằng phương pháp tìm kiếm tuần tự
(X nhập từ bàn phím).
– Tìm cuốn sách có mã là X bằng phương pháp tìm kiếm nhị
phân. (X nhập từ bàn phím).
– Liệt kê thông tin các cuốn sách có giá > G (G nhập từ bàn phím).
– Tìm cuốn sách có giá lớn nhất.
GV. Văn Thị Thiên Trang 32
Bài 3. SẮP XẾP
• Nội dung
3.1. Giới thiệu bài toán sắp xếp
3.2. Các giải thuật sắp xếp
3.2.1. Interchange Sort
3.2.2. Bubble Sort
3.2.3. Selection Sort
3.2.4. Insertion Sort
3.2.5. Quick sort
3.3. Một số giải thuật sắp xếp khác
GV. Văn Thị Thiên Trang 33
3.1. Giới thiệu bài toán sắp xếp
• Sắp xếp là quá trình
bố trí lại các phần tử
của một tập đối tượng
theo một thứ tự nhất
định.
• Trường tham gia quá trình tìm kiếm gọi là khoá (key)
• Việc sắp xếp sẽ được tiến hành dựa vào giá trị khoá này
GV. Văn Thị Thiên Trang 34
3.1. Giới thiệu bài toán sắp xếp
• Mô tả bài toán:
– Cho tập N phần tử có m thuộc tính, được biểu
diễn dưới dạng bản ghi. Dựa vào một (hoặc vài)
thuộc tính để sắp xếp các phần tử theo trật tự
mới.
– Dựa theo khóa sắp xếp định vị lại thứ tự bản ghi
– Chuyển các bản ghi về vị trí mới
• Hai thao tác cơ bản:
– So sánh
– Gán
GV. Văn Thị Thiên Trang 35
3.2. Các giải thuật sắp xếp
3.2.1. Interchange Sort
3.2.2. Bubble Sort
3.2.3. Selection Sort
3.2.4. Insertion Sort
3.2.5. Quick sort
GV. Văn Thị Thiên Trang 36
3.2.1. Interchange Sort
• Ý tưởng
– Xuất phát từ đầu dãy, lần lượt tìm những
phần tử còn lại ko thoả thứ tự với phần tử
đang xét. Với mỗi phần tử tìm được mà ko
thoả thứ tự. Thực hiện hoán vị để thoả thứ tự.
– Lặp lại tương tự với các phần tử tiếp theo
GV. Văn Thị Thiên Trang 37
3.2.1. Interchange Sort
• Các bước tiến hành
B1: i = 0; // bắt đầu từ đầu dãy
B2: j = i +1; // duyệt qua các phần tử sau
B3: Chừng nào j < n thực hiện:
Nếu a[j] < a[i] thì Đổi chỗ a[i] và a[j];
j = j +1;
B4: i = i +1;
Nếu i<n-1 thì lặp lại B2;
Ngoài ra  Kết thúc!
GV. Văn Thị Thiên Trang 38
3.2.1. Interchange Sort
10 3 7 6 2 5 4 16
i
j
GV. Văn Thị Thiên Trang 39
3.2. 2. Bubble Sort
• Ý tưởng chính
– Xuất phát từ cuối dãy, đổi chỗ các cặp phần
tử kế cận để đưa phần tử nhỏ hơn về đầu.
– Sau đó ở bước tiếp theo không xét phần tử
đó nữa. Do vậy lần xử lý thứ i sẽ có vị trí đầu
dãy là i.
– Lặp lại xử lý trên cho đến khi không còn cặp
phần tử nào được xét.
GV. Văn Thị Thiên Trang 40
3.2. 2. Bubble Sort
• Các bước tiến hành
– B1: i=0; // lần xử lý đầu tiên
– B2: j=n-1; // duyệt từ cuối dãy ngược về vị
trí i
Trong khi (j>i) thực hiện:
Nếu a[j] < a[j-1]: Hoán đổi a[j] và a[j-1]
j = j -1;
– B3: i = i+1; // lần xử lý kế tiếp
Nếu i > n-2: Hết dãy  Dừng
Ngược lại: quay lại B2
GV. Văn Thị Thiên Trang 41
3.2. 2. Bubble Sort
12
i=0
2 8 5 1 6 4 15
j=6
12
i=0
2 8 5 1 4 6 15
j=4
12
i=0
2 8 1 5 4 6 15
j=3
j=7
<
GV. Văn Thị Thiên Trang 42
3.2. 2. Bubble Sort
12
i=0
2 1 8 5 4 6 15
j=2
12
i=0
1 2 8 5 4 6 15
j=1
1
i=1
12 2 8 5 4 6 15
j=5
GV. Văn Thị Thiên Trang 43
3.2. 2. Bubble Sort
1
i=2
2 12 4 5 8 6 15
j=3
1
i=3
2 4 12 5 8 6 15
j=6
1
i=3
2 4 12 5 6 8 15
j=4
GV. Văn Thị Thiên Trang 44
3.2. 2. Bubble Sort
1
i=4
2 4 5 12 6 8 15
j=5
1
i=5
2 4 5 6 12 8 15
j=6
1
i=6
2 4 5 6 8 12 15
1 2 4 5 6 8 12 15
GV. Văn Thị Thiên Trang 45
3.2.3. Selection Sort
Ý tưởng chính
• Chọn phần tử có khóa nhỏ nhất trong N
phần tử ban đầu.
• Đổi chỗ phần tử vừa chọn với phần tử đầu
dãy
• Xem dãy hiện hành chỉ còn N-1 phần tử
(không xét phần tử đầu)
– Bắt đầu từ vị trí thứ hai
– Lặp quá trình trên cho dãy hiện hành… đến
khi dãy hiện hành chỉ còn một phần tử
GV. Văn Thị Thiên Trang 46
3.2.3. Selection Sort
• Các bước thực hiện:
–B1: i = 0
–B2: Tìm phần tử a[min] nhỏ nhất trong
dãy hiện hành từ a[i] đến a[n-1]
–B3: Hoán vị a[i] và a[min]
–B4: Nếu i < n -2 thì i = i+1  Lặp B2
Ngược lại  Dừng
GV. Văn Thị Thiên Trang 47
3.2.3. Selection Sort
12 2 8 5 1 6 4 15
i=0 Vt_min=4
1 2 8 5 12 6 4 15
i=1
1 2 8 5 12 6 4 15
i=2 Vt_min=6
GV. Văn Thị Thiên Trang 48
3.2.3. Selection Sort
1 2 4 5 12 6 8 15
i=3
1 2 4 5 12 6 8 15
i=4 Vt_min=5
1 2 4 5 6 8 12 15
i=6
1 2 4 5 6 8 12 15
GV. Văn Thị Thiên Trang 49
3.2.4. Insertion Sort
• Ý tưởng chính
– Cho dãy ban đầu a[0], a[1],.., a[n-1], ta có thể xem
dãy con gồm một phần tử a[0] đã được sắp.
– Sau đó thêm a[1] vào đoạn a[0] sao cho a[0] a[1]
được sắp.
– Tiếp tục thêm a[2] vào để có a[0] a[1] a[2] được
sắp....
– Cho đến khi thêm xong a[n-1]
vào đoạn a[0] a[1]...a[n-2]
 đoạn a[0] a[1]...a[n-2] a[n-1]
được sắp.
GV. Văn Thị Thiên Trang 50
3.2.4. Insertion Sort
• Các bước tiến hành
– B1: i = 1; //giả sử có đoạn a[0] đã được
sắp
– B2: x= a[i];
Tìm được vị trí cần chèn x vào là pos
– B3: Dời chỗ các phần tử từ a[pos]  a[i-1]
sang phải một vị trí để dành chỗ cho a[i].
– B4: a[pos] = x; // có đoạn a[0]...a[i] được sắp.
– B5: i = i +1;
Nếu i < n: Lặp lại B2
Ngược lại: Dừng  Dãy đã được sắp
GV. Văn Thị Thiên Trang 51
3.2.4. Insertion Sort
2 5 8 12 1 6 4 15
i=4
1 2 4 5 6 8 12 15
Tương tự
GV. Văn Thị Thiên Trang 52
3.2.5. Quick Sort
• huật toán do Hoare đề xuất
– Tốc độ trung bình nhanh hơn thuật toán khác
– Do đó Hoare dùng “quick” để đặt tên
• Ý tưởng chính
– QS phân hoạch dãy ban đầu thành hai phần
dựa vào một giá trị x
• Dãy 1: gồm các phần tử a[i] ko lớn hơn x (<=x)
• Dãy 2: gồm các phần tử a[i] ko nhỏ hơn x (>=x)
GV. Văn Thị Thiên Trang 53
3.2.5. Quick Sort
• Giải thuật sắp xếp dãy a[left],
a[left+1],...,a[right] được phát biểu đệ quy
như sau:
• B1: Phân hoạch dãy a[left]...a[right] thành các
dãy con:
– Dãy con 1: a[left]...a[j] < x
– Dãy con 2: a[j+1]...a[i-1] = x
– Dãy con 3: a[i]...a[right] > x
• B2:
– Nếu (left < j) // dãy con 1 có nhiều hơn 1 phần tử
Phân hoạch dãy a[left]...a[j]
– Nếu (i < right) // dãy con 3 có nhiều hơn 1 phần tử
Phân hoạch dãy a[i]...a[right]
GV. Văn Thị Thiên Trang 54
3.2.5. Quick Sort
• Sau khi phân hoạch thì dãy ban đầu được phân thành ba
phần:
– a[k] < x, với k = 1...i
– a[k] = x, với k = i..j
– a[k] > x, với k = j..n
• Nếu đoạn 1, đoạn 3 đều có 1 phần tử thì dãy ban đầu được
sắp
• Nếu đoạn 1 hoặc đoạn 3 có nhiều hơn 1 phần tử thì ta cần
sắp lại đoạn đó (áp dụng phân hoạch như trên)
a[k] < x a[k] = x a[k] > x
GV. Văn Thị Thiên Trang 55
3.2.5. Quick Sort
12 2 8 5 1 4 6 15
Left Right
0 1 2 3 4 5 6 7
i j
5
X
Stop
Not < X
Stop
Not > X
Phân hoạch dãy
GV. Văn Thị Thiên Trang 56
3.2.5. Quick Sort
4 2 1 5 8 12 6 15
Left Right
0 1 2 3 4 5 6 7
i
j
i<right => sắp xếp bằng
cách phân hoạch tiếp
i<right => sắp xếp bằng
cách phân hoạch tiếp
GV. Văn Thị Thiên Trang 57
3.3. Một số giải thuật sắp xếp khác
• Shell sort
• Radix sort
• Merge sort
• Heap sort
GV. Văn Thị Thiên Trang 58
CÂU HỎI ÔN TẬP BÀI 3
1. Viết chương trình minh hoạ các phương pháp
sắp xếp, chương trình có các chức năng chính
như sau:
– Sinh danh sách ngẫu nhiên gồm n số.
– Chọn phương pháp sắp xếp, sau khi chạy xong,
chương trình có báo thời gian chạy.
– Xem danh sách sau khi đã sắp xếp.
2. Viết chương trình nhập vào danh sách sinh viên,
thông tin của sinh viên bao gồm: mã số sinh viên,
họ tên, điểm trung bình.
– Sắp xếp danh sách sinh viên tăng dần theo họ tên.
– Sắp xếp danh sách sinh viên giảm dần theo điểm.
•
GV. Văn Thị Thiên Trang 59
Bài 4. DANH SÁCH
• Nội dung
4.1. Khái niệm
4.2. Phương pháp cài đặt danh sách
4.3. Hiện thực danh sách kề
4.4. Hiện thực danh sách liên kết đơn
4.5. Các loại danh sách liên kết khác
4.5.1. Danh sách liên kết vòng
4.5.2. Danh sách liên kết kép
GV. Văn Thị Thiên Trang 60
4.1. Khái niệm danh sách
• Danh sách là một tập hợp các phần tử cùng
kiểu dữ liệu, các phần tử trong danh sách có
tính thứ tự.
• Các thao tác cơ bản
– Khởi tạo
– Nhập/xuất danh sách
– Thêm
– Xóa
– Tìm kiếm
– Sắp xếp
GV. Văn Thị Thiên Trang 61
4.2. Phương pháp cài đặt
2 cách cài đặt
Kiểu kế tiếp Kiểu liên kết
Danh sách liên kết
-DSLK đơn
-DSLK kép
-DSLK vòng
Mảng 1 chiều
GV. Văn Thị Thiên Trang 62
4.2. Phương pháp cài đặt
• Mảng 1 chiều
– Kích thước cố định (fixed size)
– Các phần tử tuần tự theo chỉ số 0  n-1
– Truy cập ngẫu nhiên (random access)
– Chèn 1 phần tử vào mảng rất khó
0 1 2 3 4 n-2 n-1
chèn
…
GV. Văn Thị Thiên Trang 63
4.2. Phương pháp cài đặt
• Danh sách liên kết
– Cấp phát động lúc chạy chương trình
– Các phần tử nằm rải rác ở nhiều nơi trong bộ nhớ
– Kích thước danh sách chỉ bị giới hạn do RAM
– Thao tác thêm xoá đơn giản
Insert,
Delete
GV. Văn Thị Thiên Trang 64
4.3. Hiện thực danh sách kề
• Cài đặt mảng 1 chiều (SV tự cài đặt)
GV. Văn Thị Thiên Trang 65
4.4. Hiện thực DSLK đơn
• 4.4.1. Định nghĩa
• 4.4.2. Các thao tác cơ bản
GV. Văn Thị Thiên Trang 66
4.4.1. DSLK Đơn - định nghĩa
• DSLK đơn là một danh sách các node,
mỗi node gồm 2 thành phần:
– Phần chứa dữ liệu - Info
– Phần chỉ vị trí (địa chỉ) của phần tử tiếp theo
trong danh sách – Next
• Phần next là con trỏ, trỏ đến node kế tiếp
Info Next
Node
GV. Văn Thị Thiên Trang 67
4.4.1. DSLK Đơn - định nghĩa
• Khai báo 1 node
typedef struct node
{
DataType info;
struct node * next;
}Node;
info next
GV. Văn Thị Thiên Trang 68
4.4.1. DSLK Đơn - định nghĩa
• Mô tả DSLK
A1
Header Node Node
Tail Node
NUL
L
Data Next
A2 A3 An
Con trỏ đến node đầu tiên
(giữ địa chỉ của node đầu tiên)
pHead
pTail
GV. Văn Thị Thiên Trang 69
4.4.1. DSLK Đơn - định nghĩa
• Ví dụ
‘A’ 500 ‘B’ 600
‘C’ 300 ‘D’ NULL
700
700 500
600 300
Địa chỉ
pHead
pTail
GV. Văn Thị Thiên Trang 70
4.4.2. DSLK đơn – Thao tác cơ bản
• Các thao tác cơ bản
1. Init
2. IsEmpty
3. InsertFirst
4. InsertAfter
5. DeleteFirst
6. DeleteAfter
7. DeleteAll
8. ShowList
9. Search
10.Sort
Phần minh
hoạ sẽ dùng
DataType là
int
typedef struct node
{
int info;
struct node * next;
}Node;
Node* pHead;
GV. Văn Thị Thiên Trang 71
4.4.2. DSLK đơn – Thao tác cơ bản
Khởi tạo Kiểm tra rỗng
void Init(Node * &pHead)
{
pHead = NULL;
}
//trả về 1: danh sách rỗng
//trả về 0: danh sách không
rỗng
int IsEmpty(Node* pHead)
{
return (pHead==NULL);
}
GV. Văn Thị Thiên Trang 72
4.4.2. DSLK đơn – Thao tác tạo nút
•Tạo nút chứa dữ liệu X
Node* CreateNode(int X)
{
Node* p=new Node;
p->info=X;
p->next=NULL;
return p;
}
p=new Node;
new
p->info=X;
p->next=NULL;
X
GV. Văn Thị Thiên Trang 73
4.4.2. DSLK đơn – Thêm đầu
pHead
pHead
X
p=CreateNode(x);
new
pHead
1
2 3
pHead
pnext=pHead pHead=p
p
p
p
void InsertFirst(Node* &pHead, int x){…}
GV. Văn Thị Thiên Trang 74
4.4.2. DSLK đơn – Thêm sau 1 nút
p p
tam
new
p
tam tam
p
tamnext = pnext Pnext = tam
void InsertAfter(Node* p, int x){…}
GV. Văn Thị Thiên Trang 75
4.4.2. DSLK đơn – Xóa đầu
pHead pHead
pHead
p = pHead
delete p;
pHead
pHead = pHeadnext
p
p p
void DeleteFirst(Node* &pHead){…}
GV. Văn Thị Thiên Trang 76
4.4.2. DSLK đơn – Xóa sau
• Xoá phần tử sau node p trong danh sách
q
p
p
GV. Văn Thị Thiên Trang 77
4.4.2. DSLK đơn – Xóa toàn bộ
pHead
p
pHead
p
pHead
p
pHead
p
GV. Văn Thị Thiên Trang 78
4.5. Các loại DSLK khác
4.5.1. DSLK vòng
4.5.2. DSLK kép
GV. Văn Thị Thiên Trang 79
4.5.1. DSLK vòng
• Tương tự như danh sách liên kết đơn.
• Trường next của nút cuối chỉ đến đầu
danh sách
Trường Next của nút cuối ko còn trỏ đến
NULL, mà trỏ đến nút đầu
A1 A2 A3 An
GV. Văn Thị Thiên Trang 80
4.5.1. DSLK vòng
• Mô tả
– Sử dụng pList trỏ đến phần tử cuối của danh
sách
A1 A2 A3 An
pList
Tail Node
Node
GV. Văn Thị Thiên Trang 81
4.5.1. DSLK vòng
• Khai báo & khởi tạo
typedef struct node
{
DataType info;
struct node *
next;
}Node;
Node* pList;
pList = NULL;
pList trỏ nút cuối ds
Khởi tạo dslk
GV. Văn Thị Thiên Trang 82
4.5.1. DSLK kép
• Cho phép di chuyển 2 chiều đến nút trước và
sau.
– Liên kết nút trước là: prev
– Liên kết nút sau là: next
• Nút đầu có prev là NULL
• Nút cuối có next là NULL
A1 A2 An
GV. Văn Thị Thiên Trang 83
4.5.1. DSLK kép
• Khai báo
typedef struct node
{
DataType info;
struct node * prev;
struct node * next;
}Node;
Node* pHead;
pHead= NULL;
pHead quản lý ds kép
Khởi tạo dslk
trỏ đến nút trước
trỏ đến nút sau
GV. Văn Thị Thiên Trang 84
CÂU HỎI ÔN TẬP BÀI 4
1. Nhập 1 dãy số nguyên
– Tạo danh sách liên kết đơn, mỗi phần tử là một số nguyên.
– Xuất dãy số
– Cài đặt các thao tác thêm, xóa trên dãy số
2. Viết chương trình quản lý danh sách sinh viên (sử dụng DSLKĐ),
thông tin mỗi sv gồm: mã sv, họ tên, điểm trung bình. Chương
trình có các chức năng sau:
– Tạo 1 danh sách gồm n SV (n nhập từ bàn phím, thông tin của
mỗi sv nhập từ bàn phím)
– Xuất danh sách sinh viên
– Xuất thông tin các sv có ĐTB>5
– Tìm sinh viên có tên là X
– Sắp xếp danh sách tăng theo ĐTB
GV. Văn Thị Thiên Trang 85
CÂU HỎI ÔN TẬP BÀI 4 (tt)
3. Viết chương trình hiện thực danh sách
liên kết đôi.
4. Viết chương trình hiện thực danh sách
liên kết vòng.
GV. Văn Thị Thiên Trang 86
Bài 5. CẤU TRÚC STACK
5.1. Giới thiệu về Stack
5.2. Cài đặt Stack
5.3. Ứng dụng
GV. Văn Thị Thiên Trang 87
5.1. Giới thiệu Stack
• Stack là một danh
sách đặc biệt mà việc
thêm vào và loại bỏ
được thực hiện tại
một đầu (gọi là đỉnh –
top của stack).
• Hoạt động theo cơ
chế LIFO (Last In
First Out)
GV. Văn Thị Thiên Trang 88
5.1. Giới thiệu Stack
Cơ chế:
Last In First Out
LIFO
Stack
GV. Văn Thị Thiên Trang 89
5.2. Cài đặt Stack
Mảng 1 chiều Danh sách liên kết đơn
Kích thước stack
khi quá thiếu, lúc
quá thừa
Cấp phát
động!
Push / Pop hơi
phức tạp
Push/Pop
khá dễ dàng
GV. Văn Thị Thiên Trang 90
5.2. Cài đặt Stack
• Dùng danh sách liên kết đơn
typedef struct node
{
DataType info;
struct node * next;
}Node;
typedef Node * STACK;
//sử dụng
STACK s; s quản lý Stack
Đầu ds
s
GV. Văn Thị Thiên Trang 91
5.2. Cài đặt Stack
 InitStack
 IsEmpty
 Push
 Pop
Đầu ds
• Các thao tác
s
GV. Văn Thị Thiên Trang 92
5.2. Cài đặt Stack - Push
• Push: Thêm 1 phần tử x vào Stack
– Tạo node mới có dữ liệu x
– Thêm vào đầu danh sách
2 1
3
s
New
1
2
3
s
p
void Push(STACK &s, DataType x) {…}
GV. Văn Thị Thiên Trang 93
3
5.2. Cài đặt Stack - Pop
• Pop: Lấy 1 phần tử ra khỏi ngăn xếp
– Lấy ra phần tử đầu danh sách
– Trả về nội dung và giải phóng nút
1
2
3
s
s
X=
3 1
2
p
int Pop(STACK &s, DataType &x) {…}
GV. Văn Thị Thiên Trang 94
5.3. Ứng dụng của Stack
• Khử đệ quy
– Bài toán đổi số, tháp Hà Nội
• Áp dụng cho bài toán dùng cơ chế LIFO
– Chuyển biểu thức trung tố (Infix) sang biểu
thức hậu tố (Postfix)
– Tính giá trị biểu thức hậu tố
GV. Văn Thị Thiên Trang 95
5.3. Ứng dụng - Bài toán đổi số
• Nhập 1 số nguyên (VD: nhập n=13) và cơ số
(VD: CoSo=2) , xuất biểu diễn của số theo cơ số
này. 13 2
0
1
1
0
1
1
0
1
1
Ngưng
chia
2
1
6
1
1
0
0 3 2
1
1
1
1
0
2
1
GV. Văn Thị Thiên Trang 96
CÂU HỎI ÔN TẬP BÀI 5
1. Hiện thực Stack và các tác vụ của Stack
bằng danh sách liên kết.
2. Viết chương trình đổi một số thập phân
sang cơ số bất kỳ vận dụng Stack.
3. Viết chương trình cài đặt bài toán chuyển
biểu thức trung tố sang hậu tố, sau đó
tính giá trị biểu thức hậu tố.
GV. Văn Thị Thiên Trang 97
Bài 6. CẤU TRÚC QUEUE
6.1. Giới thiệu về Queue
6.2. Cài đặt Queue
6.3. Ứng dụng
GV. Văn Thị Thiên Trang 98
6.1. Giới thiệu về Queue
• Thêm vào cuối và lấy ra ở đầu
• FIFO
GV. Văn Thị Thiên Trang 99
6.2. Cài đặt Queue
• Dùng DSLK đơn
A1
NULL
A2
An
pHead pTail
GV. Văn Thị Thiên Trang 100
6.2. Cài đặt Queue
typedef struct node
{
DataType info;
struct node * next;
}Node;
typedef struct QUEUE
{
Node* pHead;
Node* pTail;
}Queue;
• Queue dùng DSLK
– Con trỏ pHead trỏ đầu
danh sách
– Con trỏ pTail trỏ đến
cuối danh sách
– Thao tác Remove diễn
ra ở pHead
– Tháo tác Insert diễn ra
ở pTail
– Thao tác thêm xoá dễ
dàng ở hai đầu
GV. Văn Thị Thiên Trang 101
6.2. Cài đặt Queue
• Các thao tác cơ bản
1. Init
2. IsEmpty
3. Insert
4. Remove
• Các thao tác bổ sung
5. QueueFirst
6. QueueLast
7. QueueSize
8. Clear
GV. Văn Thị Thiên Trang 102
6.2. Cài đặt Queue - Insert
pHead pTail
5 2 9
pHead
5 2 9
pTail
new
X
p
void Insert(Queue &Q, DataType x) {
…
}
GV. Văn Thị Thiên Trang 103
6.2. Cài đặt Queue - Remove
• TH: Hàng đợi có 1 phần tử
pHead
5
pTail
p
int Remove(Queue &Q, int &value) {
…
} GV. Văn Thị Thiên Trang 104
6.2. Cài đặt Queue - Remove
• TH: Hàng đợi có nhiều phần tử
pHead pTail
5 2 9
pHead
5 2 9
pTail
p
GV. Văn Thị Thiên Trang 105
6.3. Ứng dụng
• Ứng dụng Queue
– Trong bài toán hàng đợi “Vào trước ra trước”
FIFO:
• Hệ thống print server
• Cơ chế thông điệp, bộ đệm, hàng đợi xử lý sự
kiện…
• Các ứng dụng đặt vé tàu lửa, máy bay…
• Các hệ thống rút tiền…
GV. Văn Thị Thiên Trang 106
CÂU HỎI ÔN TẬP BÀI 6
1. Hiện thực hàng đợi và các tác vụ của
hàng đợi bằng danh sách liên kết.
2. Viết chương trình quản lý kho hàng dùng
hàng đợi được hiện thực bằng danh sách
liên kết.
GV. Văn Thị Thiên Trang 107
Bài 7. CẤU TRÚC CÂY - CÂY NHỊ PHÂN
• Nội dung
7.1. Cấu trúc cây tổng quát
7.2. Cây nhị phân
7.3. Mô tả cây nhị phân
7.3.1. Mô tả dữ liệu
7.3.2. Mô tả tác vụ
7.3.3 Duyệt cây nhị phân
7.4 Hiện thực cây nhị phân
GV. Văn Thị Thiên Trang 108
7.1. Cấu trúc cây tổng quát
GV. Văn Thị Thiên Trang 109
7.1. Cấu trúc cây tổng quát
• Tập hợp các nút và cạnh nối các nút đó
• Có một nút gọi là gốc
• Quan hệ one-to-many giữa các nút
• Có duy nhất một đường đi từ gốc đến một
nút
• Các loại cây:
– Nhị phân: mỗi nút có {0,1, 2} nút con
– Tam phân: mỗi nút có {0,1,2,3} nút con
– n-phân: mỗi nút có {0,1,..,n} nút con
GV. Văn Thị Thiên Trang 110
7.1. Cấu trúc cây tổng quát
• Nút gốc : không có nút cha
• Nút lá : không có nút con
• Nút trong : không phải nút lá và nút gốc
• Bậc của nút: số nút con của nút đó
• Bậc của cây : là bậc lớn nhất của các nút trong
cây
• Mức của nút:
– Nút gốc có mức = 0
– Các nút khác nút gốc có mức = mức của nút cha + 1;
• Chiều cao cây: là mức lớn nhất của của các nút
trong cây
GV. Văn Thị Thiên Trang 111
7.1. Cấu trúc cây tổng quát
J
Z A
D
R
B
L
F
A
K
Q Lá
Nút trong
Gốc
Cạnh
Mức 0
Mức 1
Mức 2
Mức 3
Chiều cao cây =?
GV. Văn Thị Thiên Trang 112
7.1. Cấu trúc cây tổng quát
Root
A
H
B
G
F
E
D
C
K
J
L
I
Cây con
Nút anh em
GV. Văn Thị Thiên Trang 113
7.2. Cây nhị phân (Binary tree)
GV. Văn Thị Thiên Trang 114
7.3. Mô tả cây nhị phân
7.3.1. Mô tả dữ liệu
7.3.2. Mô tả tác vụ
7.3.3. Ba phép duyệt cây nhị phân
GV. Văn Thị Thiên Trang 115
7.3.1. BT – Mô tả dữ liệu
• Cấu trúc cây đơn giản nhất, mỗi nút có tối đa 2
nút con
• Tại mỗi nút gồm các 3 thành phần
– Phần data: chứa giá trị, thông tin…
– Liên kết đến nút con trái (nếu có)
– Liên kết đến nút con phải (nếu có)
• Cây nhị phân có thể rỗng (ko có nút nào)
• Cây NP khác rỗng có 1 nút gốc
– Có duy nhất 1 đường đi từ gốc đến 1 nút
– Nút không có nút con bên trái và con bên phải là nút
lá
GV. Văn Thị Thiên Trang 116
7.3.1. BT – Mô tả dữ liệu
A
B C
D E F
I
H
G
Độ sâu/chiều cao = 3
Kích thước = 9 (số nút)
Cây con trái Cây con phải
Mức 1
Mức 2
Mức 3
Mức 0
GV. Văn Thị Thiên Trang 117
7.3.2. BT – Mô tả tác vụ
1. Khởi tạo cây
2. Kiểm tra rỗng
3. Tạo nút
4. Thêm trái
5. Thêm phải
6. Xóa trái
7. Xóa phải
8. Duyệt cây
9. Tìm kiếm
10. Xóa cây
GV. Văn Thị Thiên Trang 118
7.3.3. BT- Duyệt cây
• Duyệt cây:
– Do cây là cấu trúc không tuyến tính
– 3 cách duyệt cây NP
• Duyệt theo thứ tự trước PreOrder: NLR
• Duyệt theo thứ tự giữa InOrder: LNR
• Duyệt theo thứ tự sau PostOrder: LRN
GV. Văn Thị Thiên Trang 119
7.3.3. BT- Duyệt cây
• Ví dụ:
A
B C
D E G H
K
I L
PreOrder : A, B, D, I, E, K, C, G, H, L
InOrder : D, I, B, K, E, A, G, C, L, H
PostOrder : I, D, K, E, B, G, L, H, C, A
GV. Văn Thị Thiên Trang 120
7.4. Hiện thực cây nhị phân
• Cài đặt cây NP dùng liên kết
typedef struct node
{
DataType info;
struct node * left;
struct node * right;
} Node;
Node* pTree; Trỏ nút gốc của cây NP
Chứa thông tin của nút
Trỏ đến nút con phải
Trỏ đến nút con trái
GV. Văn Thị Thiên Trang 121
7.4. Hiện thực cây nhị phân
8
5 10
1 3 4
7
9
20
pTree
Con trỏ pTree
trỏ đến nút gốc
của cây
GV. Văn Thị Thiên Trang 122
7.4. Hiện thực cây nhị phân
• Các thao tác:
– CreateNode, FreeNode, Init, IsEmpty
– InsertLeft, InsertRight
– DeleteLeft, DeleteRight
– PreOrder, InOrder, PostOrder
– Search
– ClearTree
Phần minh
hoạ dùng
DataType là
kiểu int
GV. Văn Thị Thiên Trang 123
7.4. Hiện thực cây nhị phân
• Các thao tác mở rộng khác:
– Đếm số nút lá: CountLeaf
– Đếm số nút trên cây: CountNode
– 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
GV. Văn Thị Thiên Trang 124
CÂU HỎI ÔN TẬP BÀI 7
Cho trước 1 mảng a có n phần tử (mảng số
nguyên/ hoặc mảng cấu trúc có một trường
là khóa), hãy tạo một cây nhị phân có n
node, mỗi nút lưu 1 phần tử của mảng.
1. Cài đặt hàm duyệt cây theo thứ tự: LNR, NLR,
LRN, mức.
2. Tìm node có giá trị là X.
3. Xác định chiều cao của cây
4. Đếm số node trên cây.
5. Đếm số node lá
GV. Văn Thị Thiên Trang 125
Bài 8. CÂY NHỊ PHÂN TÌM KIẾM
• Binary Search Tree (BST)
• Nội dung
8.1. Khái niệm
8.2. Cài đặt cây nhị phân tìm kiếm
GV. Văn Thị Thiên Trang 126
8.1. BST – Khái niệm
• BST là cây nhị phân mà mỗi nút thoả
– Giá trị của tất cả nút con trái < giá trị của nút đó
– Giá trị của tất cả nút con phải > giá trị của nút
đó
5
3
1 4
10
8 20
< 5 > 5
GV. Văn Thị Thiên Trang 127
8.2. BST – Cài đặt
• Thao tác tìm kiếm
5
10
30
2 25 45
8
3 6 9 14 33 66
x = 9
9<10, left
9>5, right
9>8, right
9=9, Tìm thấy
5<9
8<9
9=9
GV. Văn Thị Thiên Trang 128
8.2. BST – Cài đặt
• Search
– Xuất phát từ gốc
• Nếu nút = NULL => ko tìm thấy
• Nếu khoá x = khóa nút gốc => tìm thấy
• Ngược lại nếu khoá x < khoá nút gốc => Tìm trên
cây bên trái
• Ngược lại => Tìm trên cây bên phải
Node* Search(Node* pTree, int x){…}
GV. Văn Thị Thiên Trang 129
8.2. BST – Cài đặt
• Xây dựng cây BST
– Chèn
– Xóa
• Luôn duy trì tính chất
– Giá trị nhỏ hơn ở bên cây con phải
– Giá trị lớn hơn ở bên cây con trái
GV. Văn Thị Thiên Trang 130
8.2. BST – Cài đặt
• Thêm một nút có dữ liệu x vào cây
• Nếu cây rỗng  thêm trực tiếp
• Ngoài ra:
– Thực hiện tìm kiếm giá trị x
– Tìm đến cuối nút Y (nếu x ko tồn tại
trong cây)
– Nếu x < y, thêm nút lá x bên trái của Y
– Nếu x > y, thêm nút lá x bên phải của
Y
5
10
30
2 25 45
20
Y
X
mới
GV. Văn Thị Thiên Trang 131
8.2. BST – Cài đặt
• Delete: xóa nhưng phải đảm bảo vẫn là cây
BST
– Thực hiện tìm nút có giá trị x
– Nếu nút là nút lá, delete nút
– Ngược lại
• Thay thế nút bằng một trong hai nút sau
– Y là nút lớn nhất của cây con bên trái
– Z là nút nhỏ nhất của cây con bên phải
• Chọn nút Y hoặc Z để thế chỗ
• Giải phóng nút
GV. Văn Thị Thiên Trang 132
8.2. BST – Cài đặt - Delete
• TH 1: nút p là nút lá, xoá bình thường
5
10
30
2 25 45
5
10
30
2 45
Xóa X = 25
GV. Văn Thị Thiên Trang
8.2. BST – Cài đặt – Delete
• TH2: p chỉ có 1 cây con
– Cho nút cha của p trỏ tới nút con duy nhất
của p
– Hủy p
5
10
30
2 25 45
Xóa X=5
10
30
2 25 45
GV. Văn Thị Thiên Trang 134
8.2. BST – Cài đặt – Delete
• TH3: nút p có 2 cây con, chọn nút thay thế để
xóa theo 1 trong 2 cách sau
– Nút lớn nhất trong cây con bên trái (lp->right==NULL)
– Nút nhỏ nhất trong cây con bên phải (rp->left==NULL)
lp - Nút lớn
bên trái
Rp - Nút nhỏ
bên phải
GV. Văn Thị Thiên Trang 135
CÂU HỎI ÔN TẬP BÀI 8
1. Cài đặt cấu trúc dữ liệu liên kết cho cây
nhị phân tìm kiếm
2. Cài đặt các thao tác xây dựng cây: Init,
IsEmpty, CreateNode
3. Cài đặt thao tác cập nhật: Insert,
Remove, ClearTree
4. Xuất danh sách tăng dần và giảm dần
GV. Văn Thị Thiên Trang 136
Bài 9. CÂY NHỊ PHÂN TÌM KIẾM
CÂN BẰNG
• Do hai nhà toán học người Nga là
Adelson Velski và Landis xây dựng vào
năm 1962 nên còn được gọi là cây AVL.
• Nội dung
– 9.1 Định nghĩa
– 9.2 Các tác vụ xoay
– 9.3 Thêm một nút vào cây AVL
– 9.4 Cài đặt cây AVL
GV. Văn Thị Thiên Trang 137
9.1. Định nghĩa
• Cây NPTK cân bằng
– Là cây nhị phân tìm kiếm
– Tại mỗi nút: số nút trên nhánh trái và nhánh
phải chênh lệch ko quá 1 nút!
P
Cây con
bên trái
Cây con
bên phải
nL(p): số nút cây con trái nút p
nR(p): số nút cây con phải nút p
GV. Văn Thị Thiên Trang 138
9.2. Các tác vụ xoay
• Quá trình cập nhật cây nhị phân tìm kiếm
thường làm cây mất cân bằng
• Thao tác:
– Xoay trái RotateLeft
– Xoay phải RotateRight
GV. Văn Thị Thiên Trang 139
9.2. Các tác vụ xoay
• RotateLeft
r
a
p
b c
Xoay trái nút r
Cây con a
Cây con b
Cây con c
Nút p sẽ trở thành
nút gốc sau khi xoay
GV. Văn Thị Thiên Trang 140
9.2. Các tác vụ xoay
• RotateLeft
r
a
p
b c
p
c
r
a b
Sau khi xoay
GV. Văn Thị Thiên Trang 141
9.2. Các tác vụ xoay
• RotateRight
r
c
p
a b
p
a
r
b c
Sau khi xoay phải
GV. Văn Thị Thiên Trang 142
9.3. Cài đặt cây AVL
• Cài đặt cây dùng liên kết
typedef struct node{
int info;
int bf; //balance factor
struct node *left, *right;
} Node;
Node* ptree;
GV. Văn Thị Thiên Trang 143
CÂU HỎI ÔN TẬP BÀI 9
1. Xét tác vụ insert và remove để thêm nút và
xoá nút trên cây AVL.
– Vẽ lại hình ảnh của cây BST nếu thêm các nút
vào cây theo thứ tự như sau: 8, 3, 5, 2, 20, 11,
30, 9, 18, 4.
– Vẽ lại hình ảnh của cây trên nếu ta lần lược xoá
2 nút 5 và 20.
2. Cài đặt cấu trúc dữ liệu liên kết cho cây
AVL, với các thao tác:
– Cài đặt các thao tác xây dựng cây: Init, IsEmpty,
CreateNode
– Cài đặt thao tác cập nhật: Insert, Remove
GV. Văn Thị Thiên Trang 144

SLIDE CAU TRUC DL_GT.pptx

  • 1.
    GV : VănThị Thiên Trang Khoa : Công Nghệ Thông Tin CẤU TRÚC DỮ LIỆU & GiẢI THUẬT 1
  • 2.
    MÔ TẢ HỌCPHẦN - Tìm hiểu các phương pháp tổ chức và những thao tác cơ sở trên từng CTDL, kết hợp với việc phát triển tư duy giải thuật để hình thành nên chương trình máy tính. - Giúp học viên hiểu được tầm quan trọng của giải thuật và cách tổ chức dữ liệu, là hai thành tố quan trọng nhất cho một chương trình. - Giúp học viên củng cố và phát triển kỹ năng lập trình được học trong giai đoạn trước. GV. Văn Thị Thiên Trang 2
  • 3.
    NỘI DUNG HỌCPHẦN - Bài 1. Tổng quan về cấu trúc dữ liệu và giải thuật - Bài 2. Tìm kiếm. - Bài 3. Sắp xếp. - Bài 4. Danh sách. - Bài 5. Cấu trúc Stack. - Bài 6. Cấu trúc Queue. - Bài 7. Cấu trúc cây, cây nhị phân. - Bài 8. Cây nhị phân tìm kiếm - BST. - Bài 9. Cây nhị phân tìm kiếm cân bằng - cây AVL. GV. Văn Thị Thiên Trang 3
  • 4.
    Bài 1. TỔNGQUAN VỀ CTDL & GT Nội dung 1.1. Vai trò CTDL trong một đề án tin học 1.2. Các tiêu chuẩn đánh giá CTDL 1.3. Trừu tượng hóa dữ liệu 1.4. Kiểu dữ liệu cơ bản 1.5. Kiểu dữ liệu có cấu trúc 1.6. Độ phức tạp của giải thuật GV. Văn Thị Thiên Trang 4
  • 5.
    1.1. Vai tròCTDL trong 1 đề án tin học Bài toán giải quyết trong máy tính Xử lý trên đối tượng DL Bài toán thực tế Đối tượng dữ liệu GV. Văn Thị Thiên Trang 5
  • 6.
    1.1. Vai tròCTDL trong 1 đề án tin học • Dữ liệu thực tế: – Muôn hình vạn trạng, đa dạng, phong phú – Thường có chứa đựng quan hệ với nhau • Cần phải tổ chức biểu diễn thành cấu trúc thích hợp nhất – Phản ánh chính xác dữ liệu thực tế – Dễ dàng xử lý trong máy tính Xây dựng CTDL GV. Văn Thị Thiên Trang 6
  • 7.
    1.1. Vai tròCTDL trong 1 đề án tin học Xây dựng thao tác xử lý Dựa trên Y/C cụ thể, xác định các trình tự giải quyết vấn đề trên máy tính để đưa kết quả mong muốn Đối tượng DL Thao tác xử lý Kết quả mong muốn Xây dựng giải thuật GV. Văn Thị Thiên Trang 7
  • 8.
    1.1. Vai tròCTDL trong 1 đề án tin học Giải thuật Chương trình Cấu trúc dữ liệu Quan hệ chặt chẽ GV. Văn Thị Thiên Trang 8
  • 9.
    1.2. Các tiêuchuẩn đánh giá CTDL • Phản ánh đúng thực tế: – Thể hiện được đầy đủ thông tin nhập/xuất của bài toán. • Phù hợp với thao tác xử lý: – Tăng tính hiệu quả của chương trình  hiệu quả của dự án tin học. • Tiết kiệm tài nguyên hệ thống: – Sử dụng tài nguyên vừa đủ để thực hiện chức năng & nhiệm vụ. GV. Văn Thị Thiên Trang 9
  • 10.
    1.3. Trừu tượnghóa dữ liệu • Trừu tượng hoá – Làm đơn giản hóa, sáng sủa, dễ hiểu hơn. – Che đi phần chi tiết, làm nổi bật cái tổng thể • Trừu tượng hoá dữ liệu: đưa ra các kiểu dữ liệu trừu tượng (Abstract Data Type) • ADT: gồm – Mô tả dữ liệu – Tác vụ liên quan • VD: tập số nguyên với các phép toán hợp, giao, hiệu là kiểu dữ liệu trừu tượng. GV. Văn Thị Thiên Trang 10
  • 11.
    1.3. Trừu tượnghóa dữ liệu • VD: mô tả kiểu dữ liệu trừu tượng về số hữu tỉ a/b với các tác vụ: +,*, / – Mô tả dữ liệu • Tử số • Mẫu số (≠0) – Mô tả tác vụ Cộng(Số_Hữu_Tỉ 1, Số_Hữu_Tỉ 2) • Nhập: – a, b là tử số và mẫu số của Số_Hữu_Tỉ 1 – c, d là tử số và mẫu số của Số_Hữu_Tỉ 2 • Xuất: – ad+bc là tử số của số hữu tỉ kết quả – bd là mẫu số của số hữu tỉ kết quả GV. Văn Thị Thiên Trang 11
  • 12.
    1.4. Kiểu dữliệu cơ bản • Thường đơn giản và không có cấu trúc, được NNLT xây dựng sẵn, nên còn gọi là kiểu dữ liệu dựng sẵn. • Thường là các trị vô hướng: – số nguyên – số thực – ký tự – giá trị logic GV. Văn Thị Thiên Trang 12
  • 13.
    1.4. Kiểu dữliệu cơ bản (tt) Tên kiểu KT Miền giá trị Ghi chú char 1 -128 đến 127 Có thể dùng như số nguyên 1 byte có dấu hay kiểu ký tự unsigned char 1 0 đến 255 Số nguyên 1 byte ko dấu int 2 -32768 đến 32767 unsigned int 2 0 đến 65355 Gọi tắt là unsigned long 4 -232 đến 231 -1 unsigned long 4 0 đến 232 -1 float 4 3.4E-38 … 3.4E38 Giới hạn chỉ trị tuyệt đối.Các giá trị <3.4E-38 được coi = 0. Tuy nhiên kiểu float chỉ có 7 chữ số có nghĩa. double 8 1.7E-308 … 1.7E308 long double 10 3.4E-4932 …1.1E4932 GV. Văn Thị Thiên Trang 13
  • 14.
    1.5. Kiểu dữliệu có cấu trúc • Kết hợp nhiều kiểu dữ liệu cơ bản để phản ánh bản chất của đối tượng thực tế • Đa số các ngôn ngữ đều cài đặt sẵn một số kiểu có cấu trúc cơ bản: mảng, chuỗi, tập tin, bản ghi… • Ngoài ra cung cấp cơ chế cho người lập trình cài đặt các dữ liệu cấu trúc khác. GV. Văn Thị Thiên Trang 14
  • 15.
    1.5. Kiểu dữliệu có cấu trúc • Cấu trúc dữ liệu Sinh viên Mã SV: chuỗi kt Tên SV: chuỗi kt Ngày sinh: ngày tháng Nơi sinh: chuỗi kt Điểm thi: số thực Sinh Viên GV. Văn Thị Thiên Trang 15
  • 16.
    1.6. Độ phứctạp của giải thuật • Sự cần thiết phân tích giải thuật GT A GT B GT C Vấn đề cần giải quyết GT tốt 1. Giải thuật đúng 2. Giải thuật đơn giản 3. Giải thuật thực hiện nhanh GV. Văn Thị Thiên Trang 16
  • 17.
    1.6. Độ phứctạp của giải thuật • Các độ phức tạp thường gặp: – O(1) : Nếu T(n) là hằng số (T(n)=C) – O(log2n) : Độ phức tạp dạng logarit – O( n) : Độ phức tạp tuyến tính – O(nlog2n): Độ phức tạp tuyến tính logarit – O( n2), O(n3),…,O(n ): Độ phức tạp đa thức – O(n!), O( nn) • Thông thường thuật giải có độ phức tạp đa thức thì có thể cài đặt • Độ phức tạp ở mức hàm mũ thì phải cải tiến giải thuật! GV. Văn Thị Thiên Trang 17
  • 18.
    1.6. Độ phứctạp của giải thuật • Thường dựa vào số phép so sánh và số phép gán • Một số công thức thường dùng n n i   1 1 1 1 1 1 1 1            a b a i b i b a i 2 ) 1 ( 1     n n i n i 2 ) 1 ( ) 1 ( a a n n i n a i       2 ) 1 ( 2 2 1 2     n n i n i 6 ) 1 2 )( 1 ( 1 2      n n n i n i 4 ) 1 ( 2 2 1 3     n n i n i GV. Văn Thị Thiên Trang 18
  • 19.
    CÂU HỎI ÔNTẬP BÀI 1 1. Viết chương trình C khai báo kiểu dữ liệu là mảng một chiều, chương trình có các chức năng như sau: – Nhập giá trị vào mảng. – Xuất các phần tử trong mảng. 2. Viết chương trình C có khai báo kiểu dữ liệu là mảng hai chiều, chương trình có các chức năng sau: – Nhập giá trị vào ma trận. – Xuất các phần tử trong ma trận. 3. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng cho thông tin sinh viên với các thao tác nhập, xuất thông tin của sinh viên. 4. Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng của số hữu tỉ a/b với các tác vụ cộng hai số hữu tỉ, nhân hai số hữu tỉ, chia hai số hữu tỉ. GV. Văn Thị Thiên Trang 19
  • 20.
    Bài 2. TÌMKIẾM • Nội dung 2.1. Giới thiệu bài toán tìm kiếm 2.2. Tìm kiếm tuyến tính 2.3. Tìm kiếm nhị phân GV. Văn Thị Thiên Trang 20
  • 21.
    2.1. Giới thiệubài toán tìm kiếm • Tìm kiếm là quá trình xác định một đối tượng nào đó trong một tập các đối tượng. Kết quả trả về: – Đối tượng tìm được (nếu có) – Chỉ số (nếu có) xác định vị trí của đối tượng trong tập đó. • Việc tìm kiếm dựa theo một trường nào đó của đối tượng, trường này là khóa (key) của việc tìm kiếm. – VD: Tìm sinh viên có họ tên X trong DSSV. • SV {MaSV, HoTen, DiaChi,…} • Khoá? • Kết quả trả về? GV. Văn Thị Thiên Trang 21
  • 22.
    2.1. Giới thiệubài toán tìm kiếm • Bài toán được mô tả như sau: – Tập dữ liệu được lưu trữ là dãy a1, a2,..,an. Giả sử chọn cấu trúc dữ liệu mảng để lưu trữ dãy số này trong bộ nhớ chính, có khai báo: int a[n]; – Khóa cần tìm là x: int x; Tìm kiếm Tìm kiếm tuyến tính Tìm kiếm nhị phân Tập dữ liệu đã được sắp xếp Tập dữ liệu bất kỳ GV. Văn Thị Thiên Trang 22
  • 23.
    2.1. Giới thiệubài toán tìm kiếm • Ý tưởng: duyệt tuần tự từ phần tử đầu tiên, lần lượt so sánh khóa tìm kiếm với khoá tương ứng của các phần tử trong danh sách. Cho đến khi gặp phần tử cần tìm hoặc đến khi duyệt hết danh sách. • Các bước tiến hành như sau: i = 0 a[i] = x i = i + 1 i<n Không tìm thấy Tìm thấy Đ Đ S S GV. Văn Thị Thiên Trang 23
  • 24.
    1.1 Tìm kiếmtuyến tính • Ví dụ: Cho dãy số a, giá trị tìm X = 8: 12 2 5 8 1 6 4 12 2 5 8 1 6 4 X = 8 Tìm thấy 12 2 5 8 1 6 4 X = 7 Không tìm thấy i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=0 i=1 i=2 i=3 i=4 i=5 i=6 GV. Văn Thị Thiên Trang 24
  • 25.
    1.1 Tìm kiếmtuyến tính • Thuật toán tìm kiếm tuyến tính /* Trả về: vị trí xuất hiện đầu tiên của x trong mảng a Trả về: -1 nếu x không có trong mảng a */ int Search(int a[], int n, int key) { int i =0; while (i<n && key != a[i]) i++; if (i < n) return i; // tìm thấy tại vị trí i return -1; // tìm không thấy } GV. Văn Thị Thiên Trang 25
  • 26.
    1.1 Tìm kiếmtuyến tính • Thuật toán tìm kiếm tuyến tính cải tiến int Search(int a[], int n, int key) { int i =0; a[n] =key; // thêm phần tử thứ n+1 while (key != a[i]) i++; if (i == n) return -1; // tìm hết mảng nhưng không có x return i; // tìm thấy x tại vị trí i } GV. Văn Thị Thiên Trang 26
  • 27.
    Nhận xét • Giảithuật tìm kiếm tuyến tính không phụ thuộc vào thứ tự của các phần tử trong mảng, do vậy đây là phương pháp tổng quát nhất để tìm kiếm trên một dãy bất kỳ • Một thuật toán có thể được cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt ảnh hưởng nhiều đến tốc độ thực hiện. Ví dụ như thuật toán Search cải tiến sẽ chạy nhanh hơn thuật toán trước do vòng lặp while chỉ so sánh một điều kiện... GV. Văn Thị Thiên Trang 27
  • 28.
    1.2 Tìm kiếmnhị phân • Phép tìm kiếm nhị phân được áp dụng trên dãy khóa đã có thứ tự: k[1]  k[2]  ...  k[n]. GV. Văn Thị Thiên Trang 28
  • 29.
    1.2 Tìm kiếmnhị phân • Giả sử ta cần tìm trong đoạn a[left,..,right] với khóa tìm kiếm là X • Chia đôi phạm vi tìm kiếm mid=(left+right)/2. • Xét phần tử giữa là a[mid]: – Nếu a[mid]=X: Tìm thấy tại vị trí mid. – Nếu a[mid]<X: • Đoạn a[left,..,mid] chứa các phần tử <X • Tìm X trong đoạn a[mid+1,.., right] – Nếu a[mid]>X: • Đoạn a[mid,..,right] chứa các phần tử >X • Tìm X trong đoạn a[left,.., right-1] • Quá trình tìm kiếm thất bại nếu left>right GV. Văn Thị Thiên Trang 29
  • 30.
    1.2 Tìm kiếmnhị phân • Cho dãy số gồm 8 phần tử bên dưới và X = 8: 1 2 4 5 6 8 12 15 1 2 4 5 6 8 12 15 Left = 0 X = 8 Right = 7 Mid = 3 1 2 4 5 6 8 12 15 Left = 4 X = 8 Right = 7 Mid = 5 Đoạn tìm kiếm Đoạn tìm kiếm = < GV. Văn Thị Thiên Trang 30
  • 31.
    1.2 Tìm kiếmnhị phân int BinarySearch(int a[], int n, int key){ int left = 0, right = n-1, mid; while (left <= right){ mid = (left + right)/ 2; // lấy điểm giữa if (a[mid] == key) // nếu tìm được return mid; if (a[mid] < key) // tìm đoạn bên phải mid left = mid+1; else right = mid-1; // tìm đoạn bên trái mid } return -1; // không tìm được } GV. Văn Thị Thiên Trang 31
  • 32.
    CÂU HỎI ÔNTẬP BÀI 2 1. Sinh mảng ngẫu nhiên gồm N số nguyên có giá trị  (- 100, 100) – Tìm phần tử có giá trị X trong mảng bằng 2 phương pháp: Tìm tuần tự và tìm nhị phân 2. Cho cấu trúc Sách (Mã sách: char[10], Tên sách: char[40], Giá: long). Viết chương trình thực hiện: – Nhập, xuất danh sách gồm N cuốn sách. – Tìm cuốn sách có mã là X bằng phương pháp tìm kiếm tuần tự (X nhập từ bàn phím). – Tìm cuốn sách có mã là X bằng phương pháp tìm kiếm nhị phân. (X nhập từ bàn phím). – Liệt kê thông tin các cuốn sách có giá > G (G nhập từ bàn phím). – Tìm cuốn sách có giá lớn nhất. GV. Văn Thị Thiên Trang 32
  • 33.
    Bài 3. SẮPXẾP • Nội dung 3.1. Giới thiệu bài toán sắp xếp 3.2. Các giải thuật sắp xếp 3.2.1. Interchange Sort 3.2.2. Bubble Sort 3.2.3. Selection Sort 3.2.4. Insertion Sort 3.2.5. Quick sort 3.3. Một số giải thuật sắp xếp khác GV. Văn Thị Thiên Trang 33
  • 34.
    3.1. Giới thiệubài toán sắp xếp • Sắp xếp là quá trình bố trí lại các phần tử của một tập đối tượng theo một thứ tự nhất định. • Trường tham gia quá trình tìm kiếm gọi là khoá (key) • Việc sắp xếp sẽ được tiến hành dựa vào giá trị khoá này GV. Văn Thị Thiên Trang 34
  • 35.
    3.1. Giới thiệubài toán sắp xếp • Mô tả bài toán: – Cho tập N phần tử có m thuộc tính, được biểu diễn dưới dạng bản ghi. Dựa vào một (hoặc vài) thuộc tính để sắp xếp các phần tử theo trật tự mới. – Dựa theo khóa sắp xếp định vị lại thứ tự bản ghi – Chuyển các bản ghi về vị trí mới • Hai thao tác cơ bản: – So sánh – Gán GV. Văn Thị Thiên Trang 35
  • 36.
    3.2. Các giảithuật sắp xếp 3.2.1. Interchange Sort 3.2.2. Bubble Sort 3.2.3. Selection Sort 3.2.4. Insertion Sort 3.2.5. Quick sort GV. Văn Thị Thiên Trang 36
  • 37.
    3.2.1. Interchange Sort •Ý tưởng – Xuất phát từ đầu dãy, lần lượt tìm những phần tử còn lại ko thoả thứ tự với phần tử đang xét. Với mỗi phần tử tìm được mà ko thoả thứ tự. Thực hiện hoán vị để thoả thứ tự. – Lặp lại tương tự với các phần tử tiếp theo GV. Văn Thị Thiên Trang 37
  • 38.
    3.2.1. Interchange Sort •Các bước tiến hành B1: i = 0; // bắt đầu từ đầu dãy B2: j = i +1; // duyệt qua các phần tử sau B3: Chừng nào j < n thực hiện: Nếu a[j] < a[i] thì Đổi chỗ a[i] và a[j]; j = j +1; B4: i = i +1; Nếu i<n-1 thì lặp lại B2; Ngoài ra  Kết thúc! GV. Văn Thị Thiên Trang 38
  • 39.
    3.2.1. Interchange Sort 103 7 6 2 5 4 16 i j GV. Văn Thị Thiên Trang 39
  • 40.
    3.2. 2. BubbleSort • Ý tưởng chính – Xuất phát từ cuối dãy, đổi chỗ các cặp phần tử kế cận để đưa phần tử nhỏ hơn về đầu. – Sau đó ở bước tiếp theo không xét phần tử đó nữa. Do vậy lần xử lý thứ i sẽ có vị trí đầu dãy là i. – Lặp lại xử lý trên cho đến khi không còn cặp phần tử nào được xét. GV. Văn Thị Thiên Trang 40
  • 41.
    3.2. 2. BubbleSort • Các bước tiến hành – B1: i=0; // lần xử lý đầu tiên – B2: j=n-1; // duyệt từ cuối dãy ngược về vị trí i Trong khi (j>i) thực hiện: Nếu a[j] < a[j-1]: Hoán đổi a[j] và a[j-1] j = j -1; – B3: i = i+1; // lần xử lý kế tiếp Nếu i > n-2: Hết dãy  Dừng Ngược lại: quay lại B2 GV. Văn Thị Thiên Trang 41
  • 42.
    3.2. 2. BubbleSort 12 i=0 2 8 5 1 6 4 15 j=6 12 i=0 2 8 5 1 4 6 15 j=4 12 i=0 2 8 1 5 4 6 15 j=3 j=7 < GV. Văn Thị Thiên Trang 42
  • 43.
    3.2. 2. BubbleSort 12 i=0 2 1 8 5 4 6 15 j=2 12 i=0 1 2 8 5 4 6 15 j=1 1 i=1 12 2 8 5 4 6 15 j=5 GV. Văn Thị Thiên Trang 43
  • 44.
    3.2. 2. BubbleSort 1 i=2 2 12 4 5 8 6 15 j=3 1 i=3 2 4 12 5 8 6 15 j=6 1 i=3 2 4 12 5 6 8 15 j=4 GV. Văn Thị Thiên Trang 44
  • 45.
    3.2. 2. BubbleSort 1 i=4 2 4 5 12 6 8 15 j=5 1 i=5 2 4 5 6 12 8 15 j=6 1 i=6 2 4 5 6 8 12 15 1 2 4 5 6 8 12 15 GV. Văn Thị Thiên Trang 45
  • 46.
    3.2.3. Selection Sort Ýtưởng chính • Chọn phần tử có khóa nhỏ nhất trong N phần tử ban đầu. • Đổi chỗ phần tử vừa chọn với phần tử đầu dãy • Xem dãy hiện hành chỉ còn N-1 phần tử (không xét phần tử đầu) – Bắt đầu từ vị trí thứ hai – Lặp quá trình trên cho dãy hiện hành… đến khi dãy hiện hành chỉ còn một phần tử GV. Văn Thị Thiên Trang 46
  • 47.
    3.2.3. Selection Sort •Các bước thực hiện: –B1: i = 0 –B2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[n-1] –B3: Hoán vị a[i] và a[min] –B4: Nếu i < n -2 thì i = i+1  Lặp B2 Ngược lại  Dừng GV. Văn Thị Thiên Trang 47
  • 48.
    3.2.3. Selection Sort 122 8 5 1 6 4 15 i=0 Vt_min=4 1 2 8 5 12 6 4 15 i=1 1 2 8 5 12 6 4 15 i=2 Vt_min=6 GV. Văn Thị Thiên Trang 48
  • 49.
    3.2.3. Selection Sort 12 4 5 12 6 8 15 i=3 1 2 4 5 12 6 8 15 i=4 Vt_min=5 1 2 4 5 6 8 12 15 i=6 1 2 4 5 6 8 12 15 GV. Văn Thị Thiên Trang 49
  • 50.
    3.2.4. Insertion Sort •Ý tưởng chính – Cho dãy ban đầu a[0], a[1],.., a[n-1], ta có thể xem dãy con gồm một phần tử a[0] đã được sắp. – Sau đó thêm a[1] vào đoạn a[0] sao cho a[0] a[1] được sắp. – Tiếp tục thêm a[2] vào để có a[0] a[1] a[2] được sắp.... – Cho đến khi thêm xong a[n-1] vào đoạn a[0] a[1]...a[n-2]  đoạn a[0] a[1]...a[n-2] a[n-1] được sắp. GV. Văn Thị Thiên Trang 50
  • 51.
    3.2.4. Insertion Sort •Các bước tiến hành – B1: i = 1; //giả sử có đoạn a[0] đã được sắp – B2: x= a[i]; Tìm được vị trí cần chèn x vào là pos – B3: Dời chỗ các phần tử từ a[pos]  a[i-1] sang phải một vị trí để dành chỗ cho a[i]. – B4: a[pos] = x; // có đoạn a[0]...a[i] được sắp. – B5: i = i +1; Nếu i < n: Lặp lại B2 Ngược lại: Dừng  Dãy đã được sắp GV. Văn Thị Thiên Trang 51
  • 52.
    3.2.4. Insertion Sort 25 8 12 1 6 4 15 i=4 1 2 4 5 6 8 12 15 Tương tự GV. Văn Thị Thiên Trang 52
  • 53.
    3.2.5. Quick Sort •huật toán do Hoare đề xuất – Tốc độ trung bình nhanh hơn thuật toán khác – Do đó Hoare dùng “quick” để đặt tên • Ý tưởng chính – QS phân hoạch dãy ban đầu thành hai phần dựa vào một giá trị x • Dãy 1: gồm các phần tử a[i] ko lớn hơn x (<=x) • Dãy 2: gồm các phần tử a[i] ko nhỏ hơn x (>=x) GV. Văn Thị Thiên Trang 53
  • 54.
    3.2.5. Quick Sort •Giải thuật sắp xếp dãy a[left], a[left+1],...,a[right] được phát biểu đệ quy như sau: • B1: Phân hoạch dãy a[left]...a[right] thành các dãy con: – Dãy con 1: a[left]...a[j] < x – Dãy con 2: a[j+1]...a[i-1] = x – Dãy con 3: a[i]...a[right] > x • B2: – Nếu (left < j) // dãy con 1 có nhiều hơn 1 phần tử Phân hoạch dãy a[left]...a[j] – Nếu (i < right) // dãy con 3 có nhiều hơn 1 phần tử Phân hoạch dãy a[i]...a[right] GV. Văn Thị Thiên Trang 54
  • 55.
    3.2.5. Quick Sort •Sau khi phân hoạch thì dãy ban đầu được phân thành ba phần: – a[k] < x, với k = 1...i – a[k] = x, với k = i..j – a[k] > x, với k = j..n • Nếu đoạn 1, đoạn 3 đều có 1 phần tử thì dãy ban đầu được sắp • Nếu đoạn 1 hoặc đoạn 3 có nhiều hơn 1 phần tử thì ta cần sắp lại đoạn đó (áp dụng phân hoạch như trên) a[k] < x a[k] = x a[k] > x GV. Văn Thị Thiên Trang 55
  • 56.
    3.2.5. Quick Sort 122 8 5 1 4 6 15 Left Right 0 1 2 3 4 5 6 7 i j 5 X Stop Not < X Stop Not > X Phân hoạch dãy GV. Văn Thị Thiên Trang 56
  • 57.
    3.2.5. Quick Sort 42 1 5 8 12 6 15 Left Right 0 1 2 3 4 5 6 7 i j i<right => sắp xếp bằng cách phân hoạch tiếp i<right => sắp xếp bằng cách phân hoạch tiếp GV. Văn Thị Thiên Trang 57
  • 58.
    3.3. Một sốgiải thuật sắp xếp khác • Shell sort • Radix sort • Merge sort • Heap sort GV. Văn Thị Thiên Trang 58
  • 59.
    CÂU HỎI ÔNTẬP BÀI 3 1. Viết chương trình minh hoạ các phương pháp sắp xếp, chương trình có các chức năng chính như sau: – Sinh danh sách ngẫu nhiên gồm n số. – Chọn phương pháp sắp xếp, sau khi chạy xong, chương trình có báo thời gian chạy. – Xem danh sách sau khi đã sắp xếp. 2. Viết chương trình nhập vào danh sách sinh viên, thông tin của sinh viên bao gồm: mã số sinh viên, họ tên, điểm trung bình. – Sắp xếp danh sách sinh viên tăng dần theo họ tên. – Sắp xếp danh sách sinh viên giảm dần theo điểm. • GV. Văn Thị Thiên Trang 59
  • 60.
    Bài 4. DANHSÁCH • Nội dung 4.1. Khái niệm 4.2. Phương pháp cài đặt danh sách 4.3. Hiện thực danh sách kề 4.4. Hiện thực danh sách liên kết đơn 4.5. Các loại danh sách liên kết khác 4.5.1. Danh sách liên kết vòng 4.5.2. Danh sách liên kết kép GV. Văn Thị Thiên Trang 60
  • 61.
    4.1. Khái niệmdanh sách • Danh sách là một tập hợp các phần tử cùng kiểu dữ liệu, các phần tử trong danh sách có tính thứ tự. • Các thao tác cơ bản – Khởi tạo – Nhập/xuất danh sách – Thêm – Xóa – Tìm kiếm – Sắp xếp GV. Văn Thị Thiên Trang 61
  • 62.
    4.2. Phương phápcài đặt 2 cách cài đặt Kiểu kế tiếp Kiểu liên kết Danh sách liên kết -DSLK đơn -DSLK kép -DSLK vòng Mảng 1 chiều GV. Văn Thị Thiên Trang 62
  • 63.
    4.2. Phương phápcài đặt • Mảng 1 chiều – Kích thước cố định (fixed size) – Các phần tử tuần tự theo chỉ số 0  n-1 – Truy cập ngẫu nhiên (random access) – Chèn 1 phần tử vào mảng rất khó 0 1 2 3 4 n-2 n-1 chèn … GV. Văn Thị Thiên Trang 63
  • 64.
    4.2. Phương phápcài đặt • Danh sách liên kết – Cấp phát động lúc chạy chương trình – Các phần tử nằm rải rác ở nhiều nơi trong bộ nhớ – Kích thước danh sách chỉ bị giới hạn do RAM – Thao tác thêm xoá đơn giản Insert, Delete GV. Văn Thị Thiên Trang 64
  • 65.
    4.3. Hiện thựcdanh sách kề • Cài đặt mảng 1 chiều (SV tự cài đặt) GV. Văn Thị Thiên Trang 65
  • 66.
    4.4. Hiện thựcDSLK đơn • 4.4.1. Định nghĩa • 4.4.2. Các thao tác cơ bản GV. Văn Thị Thiên Trang 66
  • 67.
    4.4.1. DSLK Đơn- định nghĩa • DSLK đơn là một danh sách các node, mỗi node gồm 2 thành phần: – Phần chứa dữ liệu - Info – Phần chỉ vị trí (địa chỉ) của phần tử tiếp theo trong danh sách – Next • Phần next là con trỏ, trỏ đến node kế tiếp Info Next Node GV. Văn Thị Thiên Trang 67
  • 68.
    4.4.1. DSLK Đơn- định nghĩa • Khai báo 1 node typedef struct node { DataType info; struct node * next; }Node; info next GV. Văn Thị Thiên Trang 68
  • 69.
    4.4.1. DSLK Đơn- định nghĩa • Mô tả DSLK A1 Header Node Node Tail Node NUL L Data Next A2 A3 An Con trỏ đến node đầu tiên (giữ địa chỉ của node đầu tiên) pHead pTail GV. Văn Thị Thiên Trang 69
  • 70.
    4.4.1. DSLK Đơn- định nghĩa • Ví dụ ‘A’ 500 ‘B’ 600 ‘C’ 300 ‘D’ NULL 700 700 500 600 300 Địa chỉ pHead pTail GV. Văn Thị Thiên Trang 70
  • 71.
    4.4.2. DSLK đơn– Thao tác cơ bản • Các thao tác cơ bản 1. Init 2. IsEmpty 3. InsertFirst 4. InsertAfter 5. DeleteFirst 6. DeleteAfter 7. DeleteAll 8. ShowList 9. Search 10.Sort Phần minh hoạ sẽ dùng DataType là int typedef struct node { int info; struct node * next; }Node; Node* pHead; GV. Văn Thị Thiên Trang 71
  • 72.
    4.4.2. DSLK đơn– Thao tác cơ bản Khởi tạo Kiểm tra rỗng void Init(Node * &pHead) { pHead = NULL; } //trả về 1: danh sách rỗng //trả về 0: danh sách không rỗng int IsEmpty(Node* pHead) { return (pHead==NULL); } GV. Văn Thị Thiên Trang 72
  • 73.
    4.4.2. DSLK đơn– Thao tác tạo nút •Tạo nút chứa dữ liệu X Node* CreateNode(int X) { Node* p=new Node; p->info=X; p->next=NULL; return p; } p=new Node; new p->info=X; p->next=NULL; X GV. Văn Thị Thiên Trang 73
  • 74.
    4.4.2. DSLK đơn– Thêm đầu pHead pHead X p=CreateNode(x); new pHead 1 2 3 pHead pnext=pHead pHead=p p p p void InsertFirst(Node* &pHead, int x){…} GV. Văn Thị Thiên Trang 74
  • 75.
    4.4.2. DSLK đơn– Thêm sau 1 nút p p tam new p tam tam p tamnext = pnext Pnext = tam void InsertAfter(Node* p, int x){…} GV. Văn Thị Thiên Trang 75
  • 76.
    4.4.2. DSLK đơn– Xóa đầu pHead pHead pHead p = pHead delete p; pHead pHead = pHeadnext p p p void DeleteFirst(Node* &pHead){…} GV. Văn Thị Thiên Trang 76
  • 77.
    4.4.2. DSLK đơn– Xóa sau • Xoá phần tử sau node p trong danh sách q p p GV. Văn Thị Thiên Trang 77
  • 78.
    4.4.2. DSLK đơn– Xóa toàn bộ pHead p pHead p pHead p pHead p GV. Văn Thị Thiên Trang 78
  • 79.
    4.5. Các loạiDSLK khác 4.5.1. DSLK vòng 4.5.2. DSLK kép GV. Văn Thị Thiên Trang 79
  • 80.
    4.5.1. DSLK vòng •Tương tự như danh sách liên kết đơn. • Trường next của nút cuối chỉ đến đầu danh sách Trường Next của nút cuối ko còn trỏ đến NULL, mà trỏ đến nút đầu A1 A2 A3 An GV. Văn Thị Thiên Trang 80
  • 81.
    4.5.1. DSLK vòng •Mô tả – Sử dụng pList trỏ đến phần tử cuối của danh sách A1 A2 A3 An pList Tail Node Node GV. Văn Thị Thiên Trang 81
  • 82.
    4.5.1. DSLK vòng •Khai báo & khởi tạo typedef struct node { DataType info; struct node * next; }Node; Node* pList; pList = NULL; pList trỏ nút cuối ds Khởi tạo dslk GV. Văn Thị Thiên Trang 82
  • 83.
    4.5.1. DSLK kép •Cho phép di chuyển 2 chiều đến nút trước và sau. – Liên kết nút trước là: prev – Liên kết nút sau là: next • Nút đầu có prev là NULL • Nút cuối có next là NULL A1 A2 An GV. Văn Thị Thiên Trang 83
  • 84.
    4.5.1. DSLK kép •Khai báo typedef struct node { DataType info; struct node * prev; struct node * next; }Node; Node* pHead; pHead= NULL; pHead quản lý ds kép Khởi tạo dslk trỏ đến nút trước trỏ đến nút sau GV. Văn Thị Thiên Trang 84
  • 85.
    CÂU HỎI ÔNTẬP BÀI 4 1. Nhập 1 dãy số nguyên – Tạo danh sách liên kết đơn, mỗi phần tử là một số nguyên. – Xuất dãy số – Cài đặt các thao tác thêm, xóa trên dãy số 2. Viết chương trình quản lý danh sách sinh viên (sử dụng DSLKĐ), thông tin mỗi sv gồm: mã sv, họ tên, điểm trung bình. Chương trình có các chức năng sau: – Tạo 1 danh sách gồm n SV (n nhập từ bàn phím, thông tin của mỗi sv nhập từ bàn phím) – Xuất danh sách sinh viên – Xuất thông tin các sv có ĐTB>5 – Tìm sinh viên có tên là X – Sắp xếp danh sách tăng theo ĐTB GV. Văn Thị Thiên Trang 85
  • 86.
    CÂU HỎI ÔNTẬP BÀI 4 (tt) 3. Viết chương trình hiện thực danh sách liên kết đôi. 4. Viết chương trình hiện thực danh sách liên kết vòng. GV. Văn Thị Thiên Trang 86
  • 87.
    Bài 5. CẤUTRÚC STACK 5.1. Giới thiệu về Stack 5.2. Cài đặt Stack 5.3. Ứng dụng GV. Văn Thị Thiên Trang 87
  • 88.
    5.1. Giới thiệuStack • Stack là một danh sách đặc biệt mà việc thêm vào và loại bỏ được thực hiện tại một đầu (gọi là đỉnh – top của stack). • Hoạt động theo cơ chế LIFO (Last In First Out) GV. Văn Thị Thiên Trang 88
  • 89.
    5.1. Giới thiệuStack Cơ chế: Last In First Out LIFO Stack GV. Văn Thị Thiên Trang 89
  • 90.
    5.2. Cài đặtStack Mảng 1 chiều Danh sách liên kết đơn Kích thước stack khi quá thiếu, lúc quá thừa Cấp phát động! Push / Pop hơi phức tạp Push/Pop khá dễ dàng GV. Văn Thị Thiên Trang 90
  • 91.
    5.2. Cài đặtStack • Dùng danh sách liên kết đơn typedef struct node { DataType info; struct node * next; }Node; typedef Node * STACK; //sử dụng STACK s; s quản lý Stack Đầu ds s GV. Văn Thị Thiên Trang 91
  • 92.
    5.2. Cài đặtStack  InitStack  IsEmpty  Push  Pop Đầu ds • Các thao tác s GV. Văn Thị Thiên Trang 92
  • 93.
    5.2. Cài đặtStack - Push • Push: Thêm 1 phần tử x vào Stack – Tạo node mới có dữ liệu x – Thêm vào đầu danh sách 2 1 3 s New 1 2 3 s p void Push(STACK &s, DataType x) {…} GV. Văn Thị Thiên Trang 93
  • 94.
    3 5.2. Cài đặtStack - Pop • Pop: Lấy 1 phần tử ra khỏi ngăn xếp – Lấy ra phần tử đầu danh sách – Trả về nội dung và giải phóng nút 1 2 3 s s X= 3 1 2 p int Pop(STACK &s, DataType &x) {…} GV. Văn Thị Thiên Trang 94
  • 95.
    5.3. Ứng dụngcủa Stack • Khử đệ quy – Bài toán đổi số, tháp Hà Nội • Áp dụng cho bài toán dùng cơ chế LIFO – Chuyển biểu thức trung tố (Infix) sang biểu thức hậu tố (Postfix) – Tính giá trị biểu thức hậu tố GV. Văn Thị Thiên Trang 95
  • 96.
    5.3. Ứng dụng- Bài toán đổi số • Nhập 1 số nguyên (VD: nhập n=13) và cơ số (VD: CoSo=2) , xuất biểu diễn của số theo cơ số này. 13 2 0 1 1 0 1 1 0 1 1 Ngưng chia 2 1 6 1 1 0 0 3 2 1 1 1 1 0 2 1 GV. Văn Thị Thiên Trang 96
  • 97.
    CÂU HỎI ÔNTẬP BÀI 5 1. Hiện thực Stack và các tác vụ của Stack bằng danh sách liên kết. 2. Viết chương trình đổi một số thập phân sang cơ số bất kỳ vận dụng Stack. 3. Viết chương trình cài đặt bài toán chuyển biểu thức trung tố sang hậu tố, sau đó tính giá trị biểu thức hậu tố. GV. Văn Thị Thiên Trang 97
  • 98.
    Bài 6. CẤUTRÚC QUEUE 6.1. Giới thiệu về Queue 6.2. Cài đặt Queue 6.3. Ứng dụng GV. Văn Thị Thiên Trang 98
  • 99.
    6.1. Giới thiệuvề Queue • Thêm vào cuối và lấy ra ở đầu • FIFO GV. Văn Thị Thiên Trang 99
  • 100.
    6.2. Cài đặtQueue • Dùng DSLK đơn A1 NULL A2 An pHead pTail GV. Văn Thị Thiên Trang 100
  • 101.
    6.2. Cài đặtQueue typedef struct node { DataType info; struct node * next; }Node; typedef struct QUEUE { Node* pHead; Node* pTail; }Queue; • Queue dùng DSLK – Con trỏ pHead trỏ đầu danh sách – Con trỏ pTail trỏ đến cuối danh sách – Thao tác Remove diễn ra ở pHead – Tháo tác Insert diễn ra ở pTail – Thao tác thêm xoá dễ dàng ở hai đầu GV. Văn Thị Thiên Trang 101
  • 102.
    6.2. Cài đặtQueue • Các thao tác cơ bản 1. Init 2. IsEmpty 3. Insert 4. Remove • Các thao tác bổ sung 5. QueueFirst 6. QueueLast 7. QueueSize 8. Clear GV. Văn Thị Thiên Trang 102
  • 103.
    6.2. Cài đặtQueue - Insert pHead pTail 5 2 9 pHead 5 2 9 pTail new X p void Insert(Queue &Q, DataType x) { … } GV. Văn Thị Thiên Trang 103
  • 104.
    6.2. Cài đặtQueue - Remove • TH: Hàng đợi có 1 phần tử pHead 5 pTail p int Remove(Queue &Q, int &value) { … } GV. Văn Thị Thiên Trang 104
  • 105.
    6.2. Cài đặtQueue - Remove • TH: Hàng đợi có nhiều phần tử pHead pTail 5 2 9 pHead 5 2 9 pTail p GV. Văn Thị Thiên Trang 105
  • 106.
    6.3. Ứng dụng •Ứng dụng Queue – Trong bài toán hàng đợi “Vào trước ra trước” FIFO: • Hệ thống print server • Cơ chế thông điệp, bộ đệm, hàng đợi xử lý sự kiện… • Các ứng dụng đặt vé tàu lửa, máy bay… • Các hệ thống rút tiền… GV. Văn Thị Thiên Trang 106
  • 107.
    CÂU HỎI ÔNTẬP BÀI 6 1. Hiện thực hàng đợi và các tác vụ của hàng đợi bằng danh sách liên kết. 2. Viết chương trình quản lý kho hàng dùng hàng đợi được hiện thực bằng danh sách liên kết. GV. Văn Thị Thiên Trang 107
  • 108.
    Bài 7. CẤUTRÚC CÂY - CÂY NHỊ PHÂN • Nội dung 7.1. Cấu trúc cây tổng quát 7.2. Cây nhị phân 7.3. Mô tả cây nhị phân 7.3.1. Mô tả dữ liệu 7.3.2. Mô tả tác vụ 7.3.3 Duyệt cây nhị phân 7.4 Hiện thực cây nhị phân GV. Văn Thị Thiên Trang 108
  • 109.
    7.1. Cấu trúccây tổng quát GV. Văn Thị Thiên Trang 109
  • 110.
    7.1. Cấu trúccây tổng quát • Tập hợp các nút và cạnh nối các nút đó • Có một nút gọi là gốc • Quan hệ one-to-many giữa các nút • Có duy nhất một đường đi từ gốc đến một nút • Các loại cây: – Nhị phân: mỗi nút có {0,1, 2} nút con – Tam phân: mỗi nút có {0,1,2,3} nút con – n-phân: mỗi nút có {0,1,..,n} nút con GV. Văn Thị Thiên Trang 110
  • 111.
    7.1. Cấu trúccây tổng quát • Nút gốc : không có nút cha • Nút lá : không có nút con • Nút trong : không phải nút lá và nút gốc • Bậc của nút: số nút con của nút đó • Bậc của cây : là bậc lớn nhất của các nút trong cây • Mức của nút: – Nút gốc có mức = 0 – Các nút khác nút gốc có mức = mức của nút cha + 1; • Chiều cao cây: là mức lớn nhất của của các nút trong cây GV. Văn Thị Thiên Trang 111
  • 112.
    7.1. Cấu trúccây tổng quát J Z A D R B L F A K Q Lá Nút trong Gốc Cạnh Mức 0 Mức 1 Mức 2 Mức 3 Chiều cao cây =? GV. Văn Thị Thiên Trang 112
  • 113.
    7.1. Cấu trúccây tổng quát Root A H B G F E D C K J L I Cây con Nút anh em GV. Văn Thị Thiên Trang 113
  • 114.
    7.2. Cây nhịphân (Binary tree) GV. Văn Thị Thiên Trang 114
  • 115.
    7.3. Mô tảcây nhị phân 7.3.1. Mô tả dữ liệu 7.3.2. Mô tả tác vụ 7.3.3. Ba phép duyệt cây nhị phân GV. Văn Thị Thiên Trang 115
  • 116.
    7.3.1. BT –Mô tả dữ liệu • Cấu trúc cây đơn giản nhất, mỗi nút có tối đa 2 nút con • Tại mỗi nút gồm các 3 thành phần – Phần data: chứa giá trị, thông tin… – Liên kết đến nút con trái (nếu có) – Liên kết đến nút con phải (nếu có) • Cây nhị phân có thể rỗng (ko có nút nào) • Cây NP khác rỗng có 1 nút gốc – Có duy nhất 1 đường đi từ gốc đến 1 nút – Nút không có nút con bên trái và con bên phải là nút lá GV. Văn Thị Thiên Trang 116
  • 117.
    7.3.1. BT –Mô tả dữ liệu A B C D E F I H G Độ sâu/chiều cao = 3 Kích thước = 9 (số nút) Cây con trái Cây con phải Mức 1 Mức 2 Mức 3 Mức 0 GV. Văn Thị Thiên Trang 117
  • 118.
    7.3.2. BT –Mô tả tác vụ 1. Khởi tạo cây 2. Kiểm tra rỗng 3. Tạo nút 4. Thêm trái 5. Thêm phải 6. Xóa trái 7. Xóa phải 8. Duyệt cây 9. Tìm kiếm 10. Xóa cây GV. Văn Thị Thiên Trang 118
  • 119.
    7.3.3. BT- Duyệtcây • Duyệt cây: – Do cây là cấu trúc không tuyến tính – 3 cách duyệt cây NP • Duyệt theo thứ tự trước PreOrder: NLR • Duyệt theo thứ tự giữa InOrder: LNR • Duyệt theo thứ tự sau PostOrder: LRN GV. Văn Thị Thiên Trang 119
  • 120.
    7.3.3. BT- Duyệtcây • Ví dụ: A B C D E G H K I L PreOrder : A, B, D, I, E, K, C, G, H, L InOrder : D, I, B, K, E, A, G, C, L, H PostOrder : I, D, K, E, B, G, L, H, C, A GV. Văn Thị Thiên Trang 120
  • 121.
    7.4. Hiện thựccây nhị phân • Cài đặt cây NP dùng liên kết typedef struct node { DataType info; struct node * left; struct node * right; } Node; Node* pTree; Trỏ nút gốc của cây NP Chứa thông tin của nút Trỏ đến nút con phải Trỏ đến nút con trái GV. Văn Thị Thiên Trang 121
  • 122.
    7.4. Hiện thựccây nhị phân 8 5 10 1 3 4 7 9 20 pTree Con trỏ pTree trỏ đến nút gốc của cây GV. Văn Thị Thiên Trang 122
  • 123.
    7.4. Hiện thựccây nhị phân • Các thao tác: – CreateNode, FreeNode, Init, IsEmpty – InsertLeft, InsertRight – DeleteLeft, DeleteRight – PreOrder, InOrder, PostOrder – Search – ClearTree Phần minh hoạ dùng DataType là kiểu int GV. Văn Thị Thiên Trang 123
  • 124.
    7.4. Hiện thựccây nhị phân • Các thao tác mở rộng khác: – Đếm số nút lá: CountLeaf – Đếm số nút trên cây: CountNode – 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 GV. Văn Thị Thiên Trang 124
  • 125.
    CÂU HỎI ÔNTẬP BÀI 7 Cho trước 1 mảng a có n phần tử (mảng số nguyên/ hoặc mảng cấu trúc có một trường là khóa), hãy tạo một cây nhị phân có n node, mỗi nút lưu 1 phần tử của mảng. 1. Cài đặt hàm duyệt cây theo thứ tự: LNR, NLR, LRN, mức. 2. Tìm node có giá trị là X. 3. Xác định chiều cao của cây 4. Đếm số node trên cây. 5. Đếm số node lá GV. Văn Thị Thiên Trang 125
  • 126.
    Bài 8. CÂYNHỊ PHÂN TÌM KIẾM • Binary Search Tree (BST) • Nội dung 8.1. Khái niệm 8.2. Cài đặt cây nhị phân tìm kiếm GV. Văn Thị Thiên Trang 126
  • 127.
    8.1. BST –Khái niệm • BST là cây nhị phân mà mỗi nút thoả – Giá trị của tất cả nút con trái < giá trị của nút đó – Giá trị của tất cả nút con phải > giá trị của nút đó 5 3 1 4 10 8 20 < 5 > 5 GV. Văn Thị Thiên Trang 127
  • 128.
    8.2. BST –Cài đặt • Thao tác tìm kiếm 5 10 30 2 25 45 8 3 6 9 14 33 66 x = 9 9<10, left 9>5, right 9>8, right 9=9, Tìm thấy 5<9 8<9 9=9 GV. Văn Thị Thiên Trang 128
  • 129.
    8.2. BST –Cài đặt • Search – Xuất phát từ gốc • Nếu nút = NULL => ko tìm thấy • Nếu khoá x = khóa nút gốc => tìm thấy • Ngược lại nếu khoá x < khoá nút gốc => Tìm trên cây bên trái • Ngược lại => Tìm trên cây bên phải Node* Search(Node* pTree, int x){…} GV. Văn Thị Thiên Trang 129
  • 130.
    8.2. BST –Cài đặt • Xây dựng cây BST – Chèn – Xóa • Luôn duy trì tính chất – Giá trị nhỏ hơn ở bên cây con phải – Giá trị lớn hơn ở bên cây con trái GV. Văn Thị Thiên Trang 130
  • 131.
    8.2. BST –Cài đặt • Thêm một nút có dữ liệu x vào cây • Nếu cây rỗng  thêm trực tiếp • Ngoài ra: – Thực hiện tìm kiếm giá trị x – Tìm đến cuối nút Y (nếu x ko tồn tại trong cây) – Nếu x < y, thêm nút lá x bên trái của Y – Nếu x > y, thêm nút lá x bên phải của Y 5 10 30 2 25 45 20 Y X mới GV. Văn Thị Thiên Trang 131
  • 132.
    8.2. BST –Cài đặt • Delete: xóa nhưng phải đảm bảo vẫn là cây BST – Thực hiện tìm nút có giá trị x – Nếu nút là nút lá, delete nút – Ngược lại • Thay thế nút bằng một trong hai nút sau – Y là nút lớn nhất của cây con bên trái – Z là nút nhỏ nhất của cây con bên phải • Chọn nút Y hoặc Z để thế chỗ • Giải phóng nút GV. Văn Thị Thiên Trang 132
  • 133.
    8.2. BST –Cài đặt - Delete • TH 1: nút p là nút lá, xoá bình thường 5 10 30 2 25 45 5 10 30 2 45 Xóa X = 25 GV. Văn Thị Thiên Trang
  • 134.
    8.2. BST –Cài đặt – Delete • TH2: p chỉ có 1 cây con – Cho nút cha của p trỏ tới nút con duy nhất của p – Hủy p 5 10 30 2 25 45 Xóa X=5 10 30 2 25 45 GV. Văn Thị Thiên Trang 134
  • 135.
    8.2. BST –Cài đặt – Delete • TH3: nút p có 2 cây con, chọn nút thay thế để xóa theo 1 trong 2 cách sau – Nút lớn nhất trong cây con bên trái (lp->right==NULL) – Nút nhỏ nhất trong cây con bên phải (rp->left==NULL) lp - Nút lớn bên trái Rp - Nút nhỏ bên phải GV. Văn Thị Thiên Trang 135
  • 136.
    CÂU HỎI ÔNTẬP BÀI 8 1. Cài đặt cấu trúc dữ liệu liên kết cho cây nhị phân tìm kiếm 2. Cài đặt các thao tác xây dựng cây: Init, IsEmpty, CreateNode 3. Cài đặt thao tác cập nhật: Insert, Remove, ClearTree 4. Xuất danh sách tăng dần và giảm dần GV. Văn Thị Thiên Trang 136
  • 137.
    Bài 9. CÂYNHỊ PHÂN TÌM KIẾM CÂN BẰNG • Do hai nhà toán học người Nga là Adelson Velski và Landis xây dựng vào năm 1962 nên còn được gọi là cây AVL. • Nội dung – 9.1 Định nghĩa – 9.2 Các tác vụ xoay – 9.3 Thêm một nút vào cây AVL – 9.4 Cài đặt cây AVL GV. Văn Thị Thiên Trang 137
  • 138.
    9.1. Định nghĩa •Cây NPTK cân bằng – Là cây nhị phân tìm kiếm – Tại mỗi nút: số nút trên nhánh trái và nhánh phải chênh lệch ko quá 1 nút! P Cây con bên trái Cây con bên phải nL(p): số nút cây con trái nút p nR(p): số nút cây con phải nút p GV. Văn Thị Thiên Trang 138
  • 139.
    9.2. Các tácvụ xoay • Quá trình cập nhật cây nhị phân tìm kiếm thường làm cây mất cân bằng • Thao tác: – Xoay trái RotateLeft – Xoay phải RotateRight GV. Văn Thị Thiên Trang 139
  • 140.
    9.2. Các tácvụ xoay • RotateLeft r a p b c Xoay trái nút r Cây con a Cây con b Cây con c Nút p sẽ trở thành nút gốc sau khi xoay GV. Văn Thị Thiên Trang 140
  • 141.
    9.2. Các tácvụ xoay • RotateLeft r a p b c p c r a b Sau khi xoay GV. Văn Thị Thiên Trang 141
  • 142.
    9.2. Các tácvụ xoay • RotateRight r c p a b p a r b c Sau khi xoay phải GV. Văn Thị Thiên Trang 142
  • 143.
    9.3. Cài đặtcây AVL • Cài đặt cây dùng liên kết typedef struct node{ int info; int bf; //balance factor struct node *left, *right; } Node; Node* ptree; GV. Văn Thị Thiên Trang 143
  • 144.
    CÂU HỎI ÔNTẬP BÀI 9 1. Xét tác vụ insert và remove để thêm nút và xoá nút trên cây AVL. – Vẽ lại hình ảnh của cây BST nếu thêm các nút vào cây theo thứ tự như sau: 8, 3, 5, 2, 20, 11, 30, 9, 18, 4. – Vẽ lại hình ảnh của cây trên nếu ta lần lược xoá 2 nút 5 và 20. 2. Cài đặt cấu trúc dữ liệu liên kết cho cây AVL, với các thao tác: – Cài đặt các thao tác xây dựng cây: Init, IsEmpty, CreateNode – Cài đặt thao tác cập nhật: Insert, Remove GV. Văn Thị Thiên Trang 144