Giáo trình môn học Cấu trúc dữ liệu và giải thuật

Tầm quan trọng của cấu trúc dữ liệu và giải thuật trong một

đề án tin học

1.1.1. Xây dựng cấu trúc dữ liệu

Có thể nói rằng không có một chương trình máy tính nào mà không có dữ liệu để xử lý.

Dữ liệu có thể là dữ liệu đưa vào (input data), dữ liệu trung gian hoặc dữ liệu đưa ra

(output data). Do vậy, việc tổ chức để lưu trữ dữ liệu phục vụ cho chương trình có ý

nghĩa rất quan trọng trong toàn bộ hệ thống chương trình. Việc xây dựng cấu trúc dữ

liệu quyết định rất lớn đến chất lượng cũng như công sức của người lập trình trong việc

thiết kế, cài đặt chương trình.

1.1.2. Xây dựng giải thuật

Khái niệm giải thuật hay thuật giải mà nhiều khi còn được gọi là thuật toán dùng để chỉ

phương pháp hay cách thức (method) để giải quyết vần đề. Giải thuật có thể được minh

họa bằng ngôn ngữ tự nhiên (natural language), bằng sơ đồ (flow chart) hoặc bằng mã

giả (pseudo code). Trong thực tế, giải thuật thường được minh họa hay thể hiện bằng

mã giả tựa trên một hay một số ngôn ngữ lập trình nào đó (thường là ngôn ngữ mà

người lập trình chọn để cài đặt thuật toán), chẳng hạn như C, Pascal,

Khi đã xác định được cấu trúc dữ liệu thích hợp, người lập trình sẽ bắt đầu tiến hành

xây dựng thuật giải tương ứng theo yêu cầu của bài toán đặt ra trên cơ sở của cấu trúc

dữ liệu đã được chọn. Để giải quyết một vấn đề có thể có nhiều phương pháp, do vậy

sự lựa chọn phương pháp phù hợp là một việc mà người lập trình phải cân nhắc và tính

toán. Sự lựa chọn này cũng có thể góp phần đáng kể trong việc giảm bớt công việc

của người lập trình trong phần cài đặt thuật toán trên một ngôn ngữ cụ thể.

 

pdf 229 trang kimcuc 7500
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình môn học Cấu trúc dữ liệu và giải thuật", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình môn học Cấu trúc dữ liệu và giải thuật

Giáo trình môn học Cấu trúc dữ liệu và giải thuật
MỤC LỤC 
 Mục Trang 
 CHƯƠNG 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU & GT ...........3 
 1.1. Tầm quan trọng của CTDL & GT trong một đề án tin học ........................ 3 
 1.1.1. Xây dựng cấu trúc dữ liệu ......................................................................... 3 
 1.1.2. Xây dựng giải thuật ................................................................................... 3 
 1.1.3. Mối quan hệ giữa cấu trúc dữ liệu và giải thuật ....................................... 3 
 1.2. Đánh giá Cấu trúc dữ liệu & Giải thuật ....................................................... 3 
 1.2.1. Các tiêu chuẩn đánh giá cấu trúc dữ liệu ................................................. 3 
 1.2.2. Đánh giá độ phức tạp của thuật toán ........................................................ 4 
 1.3. Kiểu dữ liệu ..................................................................................................... 4 
 1.3.1. Khái niệm về kiểu dữ liệu .......................................................................... 4 
 1.3.2. Các kiểu dữ liệu cơ sở ............................................................................... 4 
 1.3.3. Các kiểu dữ liệu có cấu trúc...................................................................... 5 
 1.3.4. Kiểu dữ liệu con trỏ ................................................................................... 5 
 1.3.5. Kiểu dữ liệu tập tin .................................................................................... 5 
 Câu hỏi và bài tập ................................................................................................. 6 
 CHƯƠNG 2: KỸ THUẬT TÌM KIẾM (Searching) .............................8 
 2.1. Khái quát về tìm kiếm.................................................................................... 8 
 2.2. Các giải thuật tìm kiếm nội ........................................................................... 8 
 2.2.1. Đặt vấn đề ................................................................................................. 8 
 2.2.2. Tìm tuyến tính ............................................................................................ 8 
 2.2.3. Tìm nhị phân ............................................................................................ 10 
 2.3. Các giải thuật tìm kiếm ngoại ..................................................................... 14 
 2.3.1. Đặt vấn đề ............................................................................................... 14 
 2.3.2. Tìm tuyến tính .......................................................................................... 14 
 2.3.3. Tìm kiếm theo chỉ mục ............................................................................. 16 
 Câu hỏi và bài tập ............................................................................................... 17 
 CHƯƠNG 3: KỸ THUẬT SẮP XẾP (SORTING) .............................19 
 3.1. Khái quát về sắp xếp .................................................................................... 19 
 3.2. Các giải thuật sắp xếp nội............................................................................ 19 
 3.2.1 Sắp xếp bằng phương pháp đổi chỗ .......................................................... 20 
 3.2.2. Sắp xếp bằng phương pháp chọn ............................................................. 28 
 3.2.3. Sắp xếp bằng phương pháp chèn ............................................................. 33 
 3.2.4. Sắp xếp bằng phương pháp trộn .............................................................. 40 
 3.3. Các giải thuật sắp xếp ngoại........................................................................ 60 
 3.3.1. Sắp xếp bằng phương pháp trộn .............................................................. 60 
 3.3.2. Sắp xếp theo chỉ mục ............................................................................... 79 
 Câu hỏi và bài tập ............................................................................................... 82 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 2 
 CHƯƠNG 4: DANH SÁCH (LIST) .....................................................84 
 4.1. Khái niệm về danh sách ............................................................................... 84 
 4.2. Các phép toán trên danh sách ..................................................................... 84 
 4.3. Danh sách đặc ............................................................................................... 85 
 4.3.1. Định nghĩa ............................................................................................... 85 
 4.3.2. Biểu diễn danh sách đặc .......................................................................... 85 
 4.3.3. Các thao tác trên danh sách đặc ............................................................. 85 
 4.3.4. Ưu nhược điểm và Ứng dụng ................................................................... 91 
 4.4. Danh sách liên kết ........................................................................................ 92 
 4.4.1. Định nghĩa ............................................................................................... 92 
 4.4.2. Danh sách liên kết đơn ............................................................................ 92 
 4.4.3. Danh sách liên kết kép .......................................................................... 111 
 4.4.4. Ưu nhược điểm của danh sách liên kết .................................................. 135 
 4.5. Danh sách hạn chế ...................................................................................... 135 
 4.5.1. Hàng đợi ................................................................................................ 135 
 4.5.2. Ngăn xếp ............................................................................................... 142 
 4.5.3. Ứng dụng của danh sách hạn chế .......................................................... 147 
 Câu hỏi và bài tập ............................................................................................. 147 
 CHƯƠNG 5: CÂY (TREE) ...............................................................149 
 5.1. Khái niệm – Biểu diễn cây......................................................................... 149 
 5.1.1. Định nghĩa cây ...................................................................................... 149 
 5.1.2. Một số khái niệm liên quan ................................................................... 149 
 5.1.3. Biểu diễn cây ......................................................................................... 151 
 5.2. Cây nhị phân ............................................................................................... 152 
 5.2.1. Định nghĩa ............................................................................................. 152 
 5.2.2. Biểu diễn và Các thao tác ..................................................................... 152 
 5.2.3. Cây nhị phân tìm kiếm ........................................................................... 163 
 5.3. Cây cân bằng............................................................................................... 188 
 5.3.1. Định nghĩa – Cấu trúc dữ liệu ............................................................... 188 
 5.3.2. Các thao tác .......................................................................................... 189 
 Câu hỏi và bài tập ............................................................................................. 227 
 ÔN TẬP (REVIEW) ..........................................................................224 
 Hệ thống lại các Cấu trúc dữ liệu và các Giải thuật đã học.......................... 224 
 Câu hỏi và Bài tập ôn tập tổng hợp ................................................................. 227 
 TÀI LIỆU THAM KHẢO .................................................................229 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 3 
Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 
1.1. Tầm quan trọng của cấu trúc dữ liệu và giải thuật trong một 
 đề án tin học 
1.1.1. Xây dựng cấu trúc dữ liệu 
Có thể nói rằng không có một chương trình máy tính nào mà không có dữ liệu để xử lý. 
Dữ liệu có thể là dữ liệu đưa vào (input data), dữ liệu trung gian hoặc dữ liệu đưa ra 
(output data). Do vậy, việc tổ chức để lưu trữ dữ liệu phục vụ cho chương trình có ý 
nghĩa rất quan trọng trong toàn bộ hệ thống chương trình. Việc xây dựng cấu trúc dữ 
liệu quyết định rất lớn đến chất lượng cũng như công sức của người lập trình trong việc 
thiết kế, cài đặt chương trình. 
1.1.2. Xây dựng giải thuật 
Khái niệm giải thuật hay thuật giải mà nhiều khi còn được gọi là thuật toán dùng để chỉ 
phương pháp hay cách thức (method) để giải quyết vần đề. Giải thuật có thể được minh 
họa bằng ngôn ngữ tự nhiên (natural language), bằng sơ đồ (flow chart) hoặc bằng mã 
giả (pseudo code). Trong thực tế, giải thuật thường được minh họa hay thể hiện bằng 
mã giả tựa trên một hay một số ngôn ngữ lập trình nào đó (thường là ngôn ngữ mà 
người lập trình chọn để cài đặt thuật toán), chẳng hạn như C, Pascal,  
Khi đã xác định được cấu trúc dữ liệu thích hợp, người lập trình sẽ bắt đầu tiến hành 
xây dựng thuật giải tương ứng theo yêu cầu của bài toán đặt ra trên cơ sở của cấu trúc 
dữ liệu đã được chọn. Để giải quyết một vấn đề có thể có nhiều phương pháp, do vậy 
sự lựa chọn phương pháp phù hợp là một việc mà người lập trình phải cân nhắc và tính 
toán. Sự lựa chọn này cũng có thể góp phần đáng kể trong việc giảm bớt công việc 
của người lập trình trong phần cài đặt thuật toán trên một ngôn ngữ cụ thể. 
1.1.3. Mối quan hệ giữa cấu trúc dữ liệu và giải thuật 
Mối quan hệ giữa cấu trúc dữ liệu và Giải thuật có thể minh họa bằng đẳng thức: 
Cấu trúc dữ liệu + Giải thuật = Chương trình 
Như vậy, khi đã có cấu trúc dữ liệu tốt, nắm vững giải thuật thực hiện thì việc thể hiện 
chương trình bằng một ngôn ngữ cụ thể chỉ là vấn đề thời gian. Khi có cấu trúc dữ liệu 
mà chưa tìm ra thuật giải thì không thể có chương trình và ngược lại không thể có 
Thuật giải khi chưa có cấu trúc dữ liệu. Một chương trình máy tính chỉ có thể được hoàn 
thiện khi có đầy đủ cả Cấu trúc dữ liệu để lưu trữ dữ liệu và Giải thuật xử lý dữ liệu 
theo yêu cầu của bài toán đặt ra. 
1.2. Đánh giá cấu trúc dữ liệu và giải thuật 
1.2.1. Các tiêu chuẩn đánh giá cấu trúc dữ liệu 
Để đánh giá một cấu trúc dữ liệu chúng ta thường dựa vào một số tiêu chí sau: 
- Cấu trúc dữ liệu phải tiết kiệm tài nguyên (bộ nhớ trong), 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 4 
- Cấu trúc dữ liệu phải phản ảnh đúng thực tế của bài toán, 
- Cấu trúc dữ liệu phải dễ dàng trong việc thao tác dữ liệu. 
1.2.2. Đánh giá độ phức tạp của thuật toán 
Việc đánh giá độ phức tạp của một thuật t oán quả không dễ dàng chút nào. Ở dây, 
chúng ta chỉ muốn ước lượng thời gian thực hiện thuận toán T(n) để có thể có sự so 
sánh tương đối giữa các thuật toán với nhau. Trong thực tế, thời gian thực hiện một 
thuật toán còn phụ thuộc rất nhiều vào các điều kiện khác như cấu tạo của máy tính, 
dữ liệu đưa vào, , ở đây chúng ta chỉ xem xét trên mức độ của lượng dữ liệu đưa vào 
ban đầu cho thuật toán thực hiện. 
Để ước lượng thời gian thực hiện thuật toán chúng ta có thể xem xét thời gian thực hiện 
thuật toán trong hai trường hợp: 
- Trong trường hợp tốt nhất: Tmin 
- Trong trường hợp xấu nhất: Tmax 
Từ đó chúng ta có thể ước lượng thời gian thực hiện trung bình của thuật toán: Tavg 
1.3. Kiểu dữ liệu 
1.3.1. Khái niệm về kiểu dữ liệu 
Kiểu dữ liệu T có thể xem như là sự kết hợp của 2 thành phần: 
- Miền giá trị mà kiểu dữ liệu T có thể lưu trữ: V, 
- Tập hợp các phép toán để thao tác dữ liệu: O. 
T = 
Mỗi kiểu dữ liệu thường được đại diện bởi một tên (định danh). Mỗi phần tử dữ liệu có 
kiểu T sẽ có giá trị trong miền V và có thể được thực hiện các phép toán thuộc tập hợp 
các phép toán trong O. 
Để lưu trữ các phần tử dữ liệu này thường phải tốn một số byte(s) trong bộ nhớ, số 
byte(s) này gọi là kích thước của kiểu dữ liệu. 
1.3.2. Các kiểu dữ liệu cơ sở 
Hầu hết các ngôn ngữ lập trình đều có cung cấp các kiểu dữ liệu cơ sở. Tùy vào mỗi 
ngôn ngữ mà các kiểu dữ liệu cơ sở có thể có các tên gọi khác nhau song chung quy 
lại có những loại kiểu dữ liệu cơ sở như sau: 
- Kiểu số nguyên: Có thể có dấu hoặc không có dấu và thường có các kích thước sau: 
+ Kiểu số nguyên 1 byte 
+ Kiểu số nguyên 2 bytes 
+ Kiểu số nguyên 4 bytes 
Kiểu số nguyên thường được thực hiện với các phép toán: O = {+, -, *, /, DIV, MOD, <, 
>, =, =, } 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 5 
- Kiểu số thực: Thường có các kích thước sau: 
+ Kiểu số thực 4 bytes 
+ Kiểu số thực 6 bytes 
+ Kiểu số thực 8 bytes 
+ Kiểu số thực 10 bytes 
Kiểu số thực thường được thực hiện với các phép toán: O = {+, -, *, /, , =, =, } 
- Kiểu ký tự: Có thể có các kích thước sau: 
+ Kiểu ký tự byte 
+ Kiểu ký tự 2 bytes 
Kiểu ký tự thường được thực hiện với các phép toán: O = {+, -, , =, =, ORD, 
CHR, } 
- Kiểu chuỗi ký tự: Có kích thước tùy thuộc vào từng ngôn ngữ lập trình 
Kiểu chuỗi ký tự thường được thực hiện với các phép toán: O = {+, &, , =, =, 
Length, Trunc, } 
- Kiểu luận lý: Thường có kích thước 1 byte 
Kiểu luận lý thường được thực hiện với các phép toán: O = {NOT, AND, OR, XOR, , 
=, =, } 
1.3.3. Các kiểu dữ liệu có cấu trúc 
Kiểu dữ liệu có cấu trúc là các kiểu dữ liệu được xây dựng trên cơ sở các kiểu dữ liệu 
đã có (có thể lại là một kiểu dữ liệu có cấu trúc khác). Tùy vào từng ngôn ngữ lập 
trình song thường có các loại sau: 
- Kiểu mảng hay còn gọi là dãy: kích thước bằng tổng kích thước của các phần tử 
- Kiểu bản ghi hay cấu trúc: kích thước bằng tổng kích thước các thành phần (Field) 
1.3.4. Kiểu dữ liệu con trỏ 
Các ngôn ngữ lập trình thường cung cấp cho chúng ta một kiểu dữ lie ... ơng pháp để chuyển từ cấu trúc dữ liệu của một cây N-phân nói 
chung thành một cây nhị phân? 
3. Trình bày thuật toán và cài đặt tất cả các thao tác trên cây nhị phân tìm kiếm, cây 
nhị phân tìm kiếm cân bằng? 
4. Trình bày thuật toán và cài đặt tất cả các thao tác trên cây nhị phân tìm kiếm, cây 
nhị phân tìm kiếm cân bằng trong trường hợp chấp nhận sự trùng khóa nhận diện 
của các nút trong cây? 
5. Trình bày tất cả các thuật toán và cài đặt tất cả các thuật toán để thực hiện việc hủy 
một nút trên cây nhị phân tìm kiếm nếu cây có 02 cây con? Theo bạn, thuật toán 
nào là đơn giản? Cho nhận xét về mỗi thuật toán? 
6. Trình bày và cài đặt tất cả các thuật toán để thực hiện các t hao tác trên cây nhị 
phân tìm kiếm, cây nhị phân tìm kiếm cân bằng trong hai trường hợp: Chấp nhận và 
Không chấp nhận sự trùng lắp về khóa của các nút bằng cách không sử dụng thuật 
toán đệ quy (Trừ các thao tác đã trình bày trong tài liệu)? 
7. Trình bày thuật toán và cài đặt chương trình thực hiện các công việc sau trên cây nhị 
phân: 
a) Tính số nút lá của cây. 
b) Tính số nút trung gian của cây. 
c) Tính chiều dài đường đi tới một nút có khóa là K trên cây. 
d) Cho biết cấp của một nút có khóa là K trên cây. 
8. Trình bày thuật toán và cài đặt chương trình thực hiện công việc tạo cây nhị phân 
tìm kiếm mà khóa của các nút là khóa của các nút trong một danh sách liên kết đôi 
sao cho tối ưu hóa bộ nhớ. Biết rằng, danh sách liên kết đôi ban đầu không cần thiết 
sau khi tạo xong cây nhị phân tìm kiếm và giả sử không cho phép sự trùng khóa 
giữa các nút trong cây. 
9. Với yêu cầu trong bài tập 8 ở trên, trong trường hợp nếu danh sách liên kết có nhiều 
nút có thành phần dữ liệu giống nhau, bạn hãy đề xuất phương án giải quyết để 
không bị mất dữ liệu sau khi tạo xong cây nhị phân tìm kiếm. 
10. Trình bày thuật toán và cài đặt chương trình thực hiện công việc chuyển cây nhị 
phân tìm kiếm thành danh sách liên kết đôi s ao cho tối ưu hóa bộ nhớ. Biết rằng, 
cây nhị phân tìm kiếm ban đầu không cần thiết sau khi tạo xong danh sách liên kết 
(ngược với yêu cầu trong bài tập 8). 
11. Trình bày thuật toán và cài đặt chương trình thực hiện công việc nhập hai cây nhị 
phân tìm kiếm thành một cây nhị phân tìm kiếm duy nhất sao cho tối ưu bộ nhớ. Biết 
rằng, hai cây nhị phân tìm kiếm ban đầu không cần thiết sau khi tạo xong cây mới. 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 224 
ÔN TẬP (REVIEW) 
Hệ thống lại các Cấu trúc dữ liệu và các Giải thuật đã học 
Chương 1: Tổng quan về Cấu Trúc Dữ Liệu và Giải Thuật 
1. Tầm quan trọng của Cấu trúc dữ liệu và Giải thuật trong một đề án tin học 
1.1. Xây dựng Cấu trúc dữ liệu 
1.2. Xây dựng Giải thuật 
1.3. Mối quan hệ giữa Cấu trúc dữ liệu và Giải thuật 
2. Đánh giá Cấu trúc dữ liệu và Giải thuật 
2.1. Các tiêu chuẩn đánh giá Cấu trúc dữ liệu 
- Thời gian thực hiện 
- Mức độ tiêu tốn bộ nhớ 
- Tính thực tế 
2.2. Đánh giá độ phức tạp của thuật toán 
3. Kiểu dữ liệu 
3.1. Khái niệm về Kiểu dữ liệu 
T = {V, O} 
3.2. Các kiểu dữ liệu cơ sở 
- Nguyên 
- Thực 
- Ký tự 
3.3. Các kiểu dữ liệu có cấu trúc 
- Mảng 
- Cấu trúc (struct) 
3.4. Kiểu dữ liệu con trỏ 
T * Pt; 
3.5. Kiểu dữ liệu tập tin 
FILE * Fp; 
int Fh; 
Chương 2: Kỹ thuật tìm kiếm (Searching) 
1. Khái quát về tìm kiếm 
2. Các giải thuật tìm kiếm nội (tìm kiếm trên dãy) 
2.1. Tìm tuyến tính (Linear Search) 
Duyệt từ đầu đến cuối mảng để tìm 
2.2. Tìm nhị phân (Binary Search) 
Duyệt từng nửa các phần tử, chỉ áp dụng cho mảng đã có thứ tự. 
3. Các giải thuật tìm kiếm ngoại (tìm kiếm trên tập tin) 
3.1. Tìm tuyến tính (Linear Search) 
Duyệt từ đầu đến cuối file để tìm 
3.2. Tìm kiếm theo chỉ mục (Index Search) 
Duyệt từ đầu đến tập tin chỉ mục để lấy dữ liệu trong tập tin dữ liệu. 
Chương 3: Kỹ thuật sắp xếp (Sorting) 
1. Khái quát về sắp xếp 
2. Các phương pháp sắp xếp nội (sắp xếp dãy) 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 225 
2.1. Sắp xếp bằng phương pháp đổi chỗ (Exchange) 
- Nổi bọt (Bubble Sort) 
- Phân hoạch (Quick Sort) 
2.3. Sắp xếp bằng phương pháp chọn (Selection) 
Chọn trực tiếp (Straight Selection Sort) 
2.4. Sắp xếp bằng phương pháp chèn (Insertion) 
- Chèn trực tiếp (Straight Insertion Sort) 
2.5. Sắp xếp bằng phương pháp trộn (Merge) 
- Trộn trực tiếp (Straight Merge Sort) 
- Trộn tự nhiên (Natural Merge Sort) 
3. Các phương pháp sắp xếp ngoại (sắp xếp tập tin) 
3.1. Sắp xếp bằng phương pháp trộn 
- Trộn trực tiếp (Straight Merge Sort) 
- Trộn tự nhiên (Natural Merge Sort) 
3.2. Sắp xếp theo chỉ mục 
Chương 4: Danh sách (List) 
1. Khái niệm về danh sách 
2. Các phép toán trên danh sách 
3. Danh sách đặc (Condensed List) 
3.1. Định nghĩa 
3.2. Biểu diễn và Các thao tác 
const int MaxLen = 10000; // hoặc: #define MaxLen 10000 
int Length; 
T CD_LIST[MaxLen]; // hoặc: T * CD_LIST = new T[MaxLen]; 
3.3. Ưu nhược điểm và Ứng dụng 
4. Danh sách liên kết (Linked List) 
4.1. Định nghĩa 
4.2. Danh sách liên kết đơn (Singly Linked List) 
typedef struct SLL_Node 
{ T Key; 
SLL_Node * NextNode; 
} SLL_OneNode; 
typedef SLL_OneNode * SLL_Type; 
4.3. Danh sách liên kết kép (Doubly Linked List) 
typedef struct DLL_Node 
{ T Key; 
DLL_Node * NextNode; 
DLL_Node * PreNode; 
} DLL_OneNode; 
typedef DLL_OneNode * DLL_Type; 
4.4. Ưu nhược điểm của danh sách liên kết 
5. Danh sách hạn chế 
5.1. Hàng đợi (Q ueue) 
typedef struct Q_C 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 226 
{ int Len; // Chiều dài hàng đợi 
int Front, Rear; 
T * List; // Nội dung hàng đợi 
} C_QUEUE; 
C_QUEUE CQ_List; 
5.2. Ngăn xếp (Stack) 
typedef struct S_C 
{ int Size; // Kích thước ngăn xếp 
int SP; 
T * List; // Nội dung ngăn xếp 
} C_STACK; 
C_STACK CS_List; 
Chương 5: Cây (Tree) 
1. Các khái niệm 
2. Cây nhị phân (Binary tree) 
2.1. Định nghĩa 
2.2. Biểu diễn và Các thao tác 
typedef struct BinT_Node 
{ T Key; 
BinT_Node * BinT_Left; 
BinT_Node * BinT_Right; 
} BinT_OneNode; 
typedef BinT_OneNode * BinT_Type; 
2.3. Cây nhị phân tìm kiếm (Binary Searching Tree) 
typedef struct BST_Node 
{ T Key; 
BST_Node * BST_Left; 
BST_Node * BST_Right; 
} BST_OneNode; 
typedef BST_OneNode * BST_Type; 
3. Cây cân bằng (Balanced tree) 
3.1. Định nghĩa 
typedef struct BAL_Node 
{ T Key; 
int Bal; 
BAL_Node * BAL_Left; 
BAL_Node * BAL_Right; 
} BAL_OneNode; 
typedef BAL_OneNode * BAL_Type; 
3.2. Các thao tác 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 227 
Câu hỏi và Bài tập ôn tập tổng hợp 
1. Phân biệt về cấu trúc dữ liệu, ý nghĩa và tác dụng giữa: danh sách liên kết đôi, danh 
sách đa liên kết có hai mối liên kết và cây nhị phân? 
2. Hãy sử dụng cấu trúc dữ liệu thích hợp để lưu trữ các số nguyên có dấu có giá trị 
tuyệt đối quá lớn trong bộ nhớ trong của máy tính. Với cấu trúc dữ liệu này, hãy 
trình bày thuật toán và cài đặt chương trình thực hiện việc cộng, trừ, nhân, chia 
nguyên, lấy dư, so sánh các số nguyên có giá trị lớn này. 
3. Hãy sử dụng cấu trúc dữ liệu thích hợp để lưu trữ độ dài đường đi giữa các Thành 
phố với nhau trong một quốc gia vào trong bộ nhớ trong của máy tính. Với cấu trúc 
dữ liệu này, hãy trình bày thuật toán và cài đặt chương trình thực hiện việc liệt kê tất 
cả các đường đi từ Thành phố A đến Thành phố B? Đường đi nào là đường đi ngắn 
nhất? 
4. Các văn bản được lưu trữ thành từng dòng trên các file văn bản, mỗi dòng có chiều 
dài không quá 127 ký tự. Hãy đề xuất cấu trúc dữ liệu thích hợp để lưu trữ trong bộ 
nhớ trong của máy tính tần suất xuất hiện của các từ trong tập tin văn bản này. Với 
cấu trúc dữ liệu này, hãy trình bày thuật toán và cài đặt chương trình thực hiện việc 
thống kê xem các từ trong file văn bản xuất hiện với tần suất như thế nào? Cho biết 
văn bản có bao nhiêu t ừ, bao nhiêu tên từ? 
5. Các văn bản được lưu trữ thành từng dòng trên các file văn bản, mỗi dòng có chiều 
dài không quá 127 ký tự. Hãy đề xuất cấu trúc dữ liệu thích hợp để lưu trữ trong bộ 
nhớ trong của máy tính các dòng văn bản trong tập tin văn bản này (có thể bộ nhớ 
không đủ để lưu toàn bộ nội dung tập tin văn bản này vào trong bộ nhớ trong của 
máy tính). Với cấu trúc dữ liệu này, hãy trình bày thuật toán và cài đặt chương trình 
thực hiện việc hiện nội tập tin văn bản này theo từng trang màn hình sao cho chúng 
ta có thể sử dụng các phím PgUp/PgDn để lật lên/xuống theo từng trang màn hình và 
sử dụng các phím Up-arrow/Down-arrow để cho trôi lên/xuống từng dòng văn bản 
trên màn hình? Cho biết văn bản có bao nhiêu dòng? 
6. Hãy sử dụng cấu trúc dữ liệu thích hợp để lưu trữ các ma trận thưa (ma trận mà chủ 
yếu giá trị các phần tử bằng 0) trong bộ nhớ trong của máy tính. Với cấu trúc dữ liệu 
này, hãy trình bày thuật toán và cài đặt chương trình thực hiện việc cộng, trừ, nhân 
hai ma trận thưa với nhau, tạo ma trận thưa chuyển vị từ một ma trận thưa khác. 
7. Hãy sử dụng cấu trúc dữ liệu thích hợp để lưu trữ Gia phả của một dòng họ nào đó 
trong bộ nhớ trong của máy tính. Với cấu trúc dữ liệu này, hãy trình bày thuật toán 
và cài đặt chương trình thực hiện việc kiểm tra xem 02 người có tên là X và Y có 
phải là hai anh em ruột hay không? Nếu không phải thì ai có “vai vế” cao hơn? Giả 
sử rằng mỗi cặp vợ chồng có không quá 05 người con. 
8. Hãy sử dụng cấu trúc dữ liệu thích hợp để lưu trữ một hệ thống Menu có nhiều mục 
chọn, nhiều cấp trong bộ nhớ trong của máy tính. Với cấu trúc dữ liệu này, hãy trình 
bày thuật toán và cài đặt chương trình thực hiện việc cho menu xuất hiện trên màn 
hình và cho phép người sử dụng chọn một chức năng nào đó của menu. 
9. Kết hợp cấu trúc dữ liệu ở trong bài tập và 4, 5 và 8. Hãy trình bày thuật toán và cài 
đặt chương trình thực hiện các chức năng của một phần mềm soạn thảo văn bản 
đơn giản? 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 228 
10. Hãy sử dụng cấu trúc dữ liệu thích hợp để lưu trữ các từ của một từ điển vào trong 
tập tin có tên DICT.DAT. Thông tin giải nghĩa về một từ bao gồm: Tên từ, Loại từ 
(Danh từ, động từ, tính từ, ), nghĩa tiếng Việt. 
a) Sử dụng tập tin chỉ mục để liệt kê các từ theo thứ tự Alphabet (A -> Z). 
b) Hãy đề xuất cấu trúc dữ liệu thích hợp để lưu trữ trong bộ nhớ trong của máy tính 
thông tin giải nghĩa của các từ trong tập tin DICT.DAT này (có thể bộ nhớ không 
đủ để lưu toàn bộ nội dung tập tin DICT.DAT này vào trong bộ nhớ trong của máy 
tính). Với cấu trúc dữ liệu này, hãy trình bày thuật toán và cài đặt chương trình 
thực hiện việc tra nghĩa cho một từ. Ngoài ra, ta có thể sử dụng các phím 
PgUp/PgDn để lật lên/xuống theo từng trang (do mình quy định) màn hình và sử 
dụng các phím Up-arrow/Down-arrow để cho trôi lên/xuống từng từ trên màn 
hình? Sử dụng cấu trúc dữ liệu thích hợp để lưu trữ trong bộ nhớ trong các từ đã 
được tra nghĩa. 
11. Người ta lưu trữ các hệ số của một đa thức bậc n thành các dòng văn bản trong file 
DATHUC.DAT theo nguyên tắc: Mỗi dòng là hệ số và số mũ của 1 đa thức và các hệ 
số và số mũ này cách nhau ít nhất là một khoảng trắng. 
Hãy sử dụng cấu trúc dữ liệu thích hợp để lưu trữ một đa thức vào trong bộ nhớ 
trong của máy tính. Với cấu trúc dữ liệu này, hãy trình bày thuật toán và cài đặt 
chương trình thực hiện các công việc sau: 
- Xuất các đa thức trong file DATHUC.DAT ra màn hình; 
- Tính đa thức tổng, đa thức hiệu của các đa t hức này; 
- Tính đa thức tích của các đa thức này. 
12. Một hình vuông có độ dài cạnh là a được tô 02 màu: trắng và đen. Người ta tiến 
hành chia hình vuông này thành 04 hình vuông con đều nhau và ghi nhận vị trí của 
chúng trong hình vuông lớn. Nếu trong mỗi hình vuông con chỉ gồm toàn màu trắng 
hoặc màu đen thì giữ nguyên, còn nếu trong hình vuông con còn có 02 màu thì tiếp 
tục chia hình vuông con này thành 04 hình vuông con nhỏ hơn và ghi nhận vị trí, , 
cứ như vậy sau một số hữu hạn phép chia sẽ kết thúc việc chia. Hãy sử dụng cấu 
trúc dữ liệu thích hợp để lưu trữ các hình vuông này vào trong bộ nhớ trong của máy 
tính. Với cấu trúc dữ liệu lựa chọn, hãy trình bày thuật toán và cài đặt chương trình 
thực hiện các công việc sau: 
- Tính tổng số hình vuông tạo thành qua các lần chia. 
- Tính tổng số hình vuông màu trắng, màu đen và tổng diện tích tương ứng của 
chúng. 
- Tái tạo lại hình vuông ban đầu. 
13. Định nghĩa cấu trúc dữ liệu thích hợp để lưu trữ các giá trị trong tam giác Pascal 
vào trong bộ nhớ trong của máy tính. Với cấu trúc dữ liệu này hãy trình bày thuật 
toán và viết chương trình thực hiện các công việc sau: 
- In tam giác Pascal có N dòng ra màn hình. 
- In và tính giá trị biểu thức (a+b)N ra màn hình. 
14. Trình bày thuật toán và viết chương trình thực hiện công việc minh họa (Demo) quá 
trình thực hiện tất cả các thuật toán đã học. 
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật 
 Trang: 229 
IV. HƯỚNG DẪN SỬ DỤNG TÀI LIỆU THAM KHẢO 
1. Cấu trúc dữ liệu 
Tác giả: Nguyễn Trung Trực 
Khoa CNTT, trường ĐHBK TP.HCM 
2. Giáo trình Cấu trúc dữ liệu 1 
Tác giả: Trần Hạnh Nhi – Dương Anh Đức 
Khoa CNTT, trường ĐHKHTN – ĐHQG TP.HCM 
3. Algorithms + Data Structures = Programs 
Tác giả: N.Wirth 
NXB: Prentice Hall, 1976 
4. Data Structures and Algorithms 
Tác giả: Alfred V.Aho - John E.Hopcroft – Jeffrey D.Ullman 
NXB: Addison-Wesley Publishing Company 
5. Algorithms (Second Edition) 
Tác giả: Robert Sedgewick 
NXB: Addison-Wesley Publishing Company 
6. Data Structures and Program Design (Third Edition) 
Tác giả: Robert L.Kruse 
NXB: Prentice Hall 

File đính kèm:

  • pdfgiao_trinh_mon_hoc_cau_truc_du_lieu_va_giai_thuat.pdf