Nếu dãy khoá luôn biến động thìlúc đó chi phí cho sắp xếp lại nổi lên rất rõ và chính điều ấy bộc lộ nhượcđiểm của phương pháp này.Để khắc phục nhược điểm vừa nêu trên đối với tìm kiếm n
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM
KHOA TIN HỌC
KHÓA LUẬN TỐT NGHIỆP
: PGS.TSKH Trần Quốc Chiến : Phan Thị Như Ngọc
: 08SPT
Đà Nẵng - 5/ 2012
Trang 2LỜI CẢM ƠN
Trước khi trình bày đề tài, em xin bày tỏ lòng biết
ơn chân thành đến tất cả các thầy cô trong khoa Tin học,đặc biệt PGS TSKH Trần Quốc Chiến trong thời gianqua đã tận tâm giảng dạy, hướng dẫn tạo mọi điều kiệnthuận lợi để em hoàn thành đề tài này
Em cũng xin thành thật cảm ơn những người thân,bạn bè đã động viên, giúp đỡ trong thời gian xây dựng
đề tài
Chân thành cảm ơn!!
Sinh viên thực hiệnPhan Thị Như Ngọc
Trang 3Ý KIẾN ĐÁNH GIÁ CỦA GIÁO VIÊN HƯỚNG DẪN
Đà Nẵng, ngày tháng năm 2012
Giáo viên hướng dẫn
PGS-TSKH Trần Quốc Chiến
Trang 4MỤC LỤC LỜI CẢM ƠN
Ý KIẾN ĐÁNH GIÁ CỦA GIÁO VIÊN HƯỚNG DẪN MỤC LỤC
LỜI MỞ ĐẦU 7
I LÍ DO CHỌN ĐỀ TÀI: 7
II MỤC TIÊU NHIỆM VỤ: 8
III PHƯƠNG PHÁP NGHIÊN CỨU: 8
IV BỐ CỤC CỦA ĐỀ TÀI: 9
CHƯƠNG I: TỔNG QUAN VỀ CẤU TRÚC CÂY 10
I CẤU TRÚC CÂY: 10
1 ĐỊNH NGHĨA VÀ CÁC KHÁI NIỆM VỀ CÂY: 10
2 SƠ ĐỒ CẤU TRÚC CÂY: 11
3 ỨNG DỤNG CẤU TRÚC CÂY: 12
4 MỘT SỐ VÍ DỤ VỀ ĐỐI TƯỢNG CÁC CẤU TRÚC DẠNG CÂY: 12
4.1 Sơ đồ tổ chức của một công ty: 12
4.2 Mục lục một quyển sách: 13
4.3 Biểu diễn biểu thức số học dưới dạng cây: x + y * (z - t) + u / v 13
5 NHẬN XÉT: 14
II TÌM HIỂU CÂY NHỊ PHÂN : 14
1 ĐỊNH NGHĨA : 14
2 MỘT SỐ DẠNG ĐẶC BIỆT CỦA CÂY NHỊ PHÂN : 14
3 TÍNH CHẤT : 16
CHƯƠNG II: CÂY NHỊ PHÂN TÌM KIẾM 17
I MỘT SỐ KHÁI NIỆM: 17
II SƠ ĐỒ CÂY NHỊ PHÂN TÌM KIẾM: 17
III CẤU TRÚC DỮ LIỆU: 18
IV CÁC THAO TÁC TRÊN CÂY NHỊ PHÂN TÌM KIẾM: 18
1 Khởi tạo cây Binary Search Tree: 18
1.1 Khởi tạo cây Binary Search Tree: 18
Trang 51.2 Tạo Node: 18
1.3 Tạo cây nhị phân tìm kiếm: 19
2 Duyệt cây nhị phân tìm kiếm: 20
2.1 Duyệt theo thứ tự trước (Node - Left - Right): 20
2.2 Duyệt theo thứ tự giữa (Left - Node - Right): 21
2.3 Duyệt theo thứ tự sau (Left - Right - Node): 21
3 Tìm một phần tử x trong cây: 22
Giải thuật tìm kiếm: 22
Nhận xét: 22
3.1 Tìm theo đệ quy: 24
3.2 Tìm theo không đệ quy: 25
3.3 Thêm một nút vào cây Binary Search Tree: 25
3.4 Nhận xét: 27
4 Hủy một phần tử có khóa X: 27
4.1 Trường hợp 1: X là nút lá 27
4.2 Trường hợp 2: X chỉ có một con (bên trái hoặc bên phải) 28
4.3 Trường hợp 3: X có đủ hai con 29
5 Hủy toàn bộ cây nhị phân tìm kiếm: 32
V NHẬN XÉT: 33
CHƯƠNG III: CÂY ĐỎ ĐEN 34
I GIỚI THIỆU: 34
II ĐỊNH NGHĨA: 34
III TÍNH CHẤT: 35
IV THUẬN LỢI KHI SỬ DỤNG: 36
V CẤU TRÚC CÂY ĐỎ ĐEN: 38
1 Cấu trúc lưu trữ: 38
2 Khai báo cây đỏ đen: 38
VI CÁC THUẬT TOÁN CƠ BẢN CỦA BLACK AND RED TREE: 39
1 Phép quay: 39
2 Thêm một node mới: 39
2.1 Các phép lật màu trên đường đi xuống: 41
2.2 Các phép quay khi chèn node: 42
Trang 62.3 Các thao tác khôi phục cây: 49
2.4 Các trường hợp vi phạm chính: 50
2.4.1 Trường hợp 1: 50 2.4.2 Trường hợp 2: 51 2.4.3 Trường hợp 3: 52 2.5 Nhận xét khi chèn: 53
2.6 Code: 54
3 Xóa một node: 57
3.1 Trường hợp 1: 58
3.2 Trường hợp 2: 58
3.3 Trường hợp 3: 59
3.4 Trường hợp 4: 59
4 Tìm kiếm: 61
I GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH: 64
1 Vài nét về ngôn ngữ Java: 64
2 Một số đặc điểm của ngôn ngữ Java: 64
3 Giới thiệu ứng dụng của Java vào chương trình cây đỏ đen: 65
II DEMO CHƯƠNG TRÌNH: 66
KẾT LUẬN 68
TÀI LIỆU THAM KHẢO 69
Trang 7LỜI MỞ ĐẦU
I LÍ DO CHỌN ĐỀ TÀI:
Trong khoa học máy tính, cấu trúc dữ liệu là một cách lưu dữ liệutrong máy tính sao cho nó có thể sử dụng một cách hiệu quả Một cấutrúc dữ liệu được thiết kế tốt cho phép thực hiện nhiều phép toán, sửdụng càng ít tài nguyên, thời gian xử lý và không gian bộ nhớ tốt
Chúng ta đều biết việc tìm kiếm là một đòi hỏi rất thường xuyêntrong đời sống hằng ngày cũng như trong xử lý Tin học Vấn đề tìm kiếmxét một cách tổng quát, có thể hiểu là tìm một đối tượng thỏa mãn một sốđòi hỏi nào đó, trong một tập rộng lớn các đối tượng Khi không liên quanđến mục đích xử lý cụ thể nào khác, bài toán tìm kiếm có thể được phátbiểu độc lập và tổng quát như sau:
“Cho một bảng gồm n bản ghi R1, R2,…, Rn Mỗi bản ghi Ri (1≤i≤n)tương ứng với một khóa ki Hãy tìm bản ghi có giá trị khóa tương ứngbằng X cho trước”
X được gọi là khóa tìm kiếm Công việc tìm kiếm sẽ được hoànthành khi có một trong hai tình huống sau đây xảy ra:
1 Tìm được bản ghi có giá trị khóa tương ứng bằng X, lúc đó
ta nói phép tìm kiếm thành công (successfull)
2 Không tìm thấy được bản ghi nào có giá trị khóa bằng X.Phép tìm kiếm không thành công (unsuccessfull) Sau một phép tìm kiếmkhông thỏa có khi xuất hiện yêu cầu bổ sung thêm bản ghi mới có khóa bằng
X vào bảng Giải thuật thể hiện cả yêu cầu này được gọi là giải thuật “tìmkiếm có bổ sung”
Có nhiều phương pháp tìm kiếm cơ bản và thông dụng, đối với dữliệu ở bộ nhớ trong là tìm kiếm trong, đối với dữ liệu ở bộ nhớ ngoài làtìm kiếm ngoài Đối với tìm kiếm trong, tìm kiếm nhị phân là phương pháp
Trang 8tìm kiếm khá thông dụng, chi phí ít, đạt kết quả tốt Tuy nhiên khi sử dụngtìm kiếm nhị phân dãy khoá đã phải được sắp xếp rồi, nghĩa là thời gianchi phí cho sắp xếp cũng phải kể đến Nếu dãy khoá luôn biến động thìlúc đó chi phí cho sắp xếp lại nổi lên rất rõ và chính điều ấy bộc lộ nhượcđiểm của phương pháp này.
Để khắc phục nhược điểm vừa nêu trên đối với tìm kiếm nhị phân vàđáp ứng yêu cầu tìm kiếm đối với bảng biến động, một phương pháp mớiđược hình thành dựa trên cơ sở bảng được tổ chức dưới dạng cây nhịphân mà ta gọi là cây nhị phân tìm kiếm
Trong đó, cây đỏ đen là một trong những cấu trúc dữ liệu hay, cùngvới cây tìm kiếm nhị phân là những cấu trúc dữ liệu có điểm mạnh trongviệc lưu trữ và tìm kiếm dữ liệu Song cây đỏ đen có những đặc tínhriêng mà nhờ đó nó đã làm nổi bật những điểm mạnh của mình Thuậttoán quan trọng trong cây cân bằng Trên cơ sở đó với sự định hướngcủa thầy giáo hướng dẫn PGS-TSKH Trần Quốc Chiến em đã chọn đề tài
“Cấu trúc dữ liệu cây đỏ đen và mô phỏng ”.
- Đề tài nhằm nghiên cứu lý thuyết về cây đỏ đen, một dạng cây nhịphân tìm kiếm tự cân bằng để thấy được những điểm mạnh của kiểu cấu trúc
dữ liệu này
- Đề tài nhằm khẳng định làm rõ những khái niệm, tính chất và việc
sử dụng cấu trúc dữ liệu cây đỏ đen vào việc lưu trữ dữ liệu và thực hiện tìmkiếm trong bài toán tìm kiếm
- Thực hiện nghiên cứu và mô phỏng các phép toán chèn, xóa, tìm kiếm trên cây đỏ đen, đánh giá chúng so với cây nhị phân tìm kiếm
III PHƯƠNG PHÁP NGHIÊN CỨU:
- Tham khảo các tài liệu, bài viết, giáo trình có liên quan đến cấu trúc cây, cây nhị phân tìm kiếm, cây đỏ đen, tài liệu trên mạng
Trang 9- Sử dụng các ngôn ngữ như lập trình hướng đối tượng…để xây dựng các bước mô phỏng các thuật toán trên cây đỏ đen.
IV BỐ CỤC CỦA ĐỀ TÀI:
LỜI MỞ ĐẦU
Báo cáo được chia thành 4 chương:
Chương I: Tổng quan về cấu trúc cây
Chương này giới thiệu tổng quan về cấu trúc cây, khái niệm vàcác tính chất cây, cây nhị phân
Chương II: Cây nhị phân tìm kiếm
Chương này trình bày về cây tìm kiếm nhị phân bao gồm: địnhnghĩa, các giải thuật tìm kiếm, các thao tác chèn và xóa trên cây nhịphân tìm kiếm, đánh giá về thời gian, độ phức tạp của các thao tác này
Chương III: Cây đỏ đen
Chương này trình bày khái niệm, tính chất cây đỏ đen, cácphép toán chèn, xóa, tìm kiếm trên cây đỏ đen, đánh giá về thời gian,
độ phức tạp của các phép toán này, những thuận lợi khi sử dụng cấutrúc cây đỏ đen
Chương IV: Cài đặt chương trình
KẾT LUẬN
TÀI LIỆU THAM KHẢO
Trang 10CHƯƠNG I: TỔNG QUAN VỀ CẤU TRÚC CÂY
I CẤU TRÚC CÂY:
1 ĐỊNH NGHĨA VÀ CÁC KHÁI NIỆM VỀ CÂY:
- Cây là một đồ thị liên thông và không có chu trình đơn
- Cây đã được dùng từ năm 1857, khi nhà toán học Anh tên ArthurCayley dùng cây để xác định những dạng khác nhau của hợp chất hóa học
Từ đó, cây đã được dùng để giải nhiều bài toán trong nhiều lĩnh vực khácnhau trong đó cây rất hay sử dụng trong Tin học
- Cây là một tập hợp T các phần tử (gọi là nút của cây) trong đó cómột nút đặc biệt gọi là nút gốc (root), các nút còn lại được chia thành nhữngtập rời nhau T1, T2, …, Tn theo quan hệ phân cấp trong đó Ti cũng được gọi làmột cây Mỗi nút ở cấp i sẽ quản lý một số nút ở cấp i +1 Quan hệ này người
ta còn gọi là quan hệ cha - con
- Gốc của cây là một đỉnh đặc biệt, thông thường là đỉnh trên cùng.Mức của đỉnh là độ dài đường đi từ gốc đến đỉnh đó Chiều cao của cây là sốmức lớn nhất của nút có trên cây đó
- Rừng là đồ thị mà mỗi thành phần liên thông là cây
Trang 11- Một nút là một cây Nút đó cũng gọi là gốc của cây ấy.
- Bậc của một nút là số cây con của nút đó
- Bậc của một cây là bậc lớn nhất của các nút trong cây (số cây contối đa của một nút thuộc cây)
- Cây có bậc n thì gọi là cây n-phân Cây n-phân là cây mà mọi đỉnh
có tối đa n con và có ít nhất một đỉnh có n con
- Cây n-phân đầy đủ là cây mà mọi đỉnh trong có đúng n con
- Cây cân bằng là cây mà mọi đỉnh lá có mức là h hay h-1, trong đó
h là chiều cao của cây
- Đỉnh lá là đỉnh có bậc 1 còn được gọi là lá Thường dùng cho cây
có gốc, khi đó lá là đỉnh không có con
Trang 124 MỘT SỐ VÍ DỤ VỀ ĐỐI TƯỢNG CÁC CẤU TRÚC DẠNG CÂY:
4.1 Sơ đồ tổ chức của một công ty:
Trang 13BB-Electronic
Trang 145 NHẬN XÉT:
- Trong cấu trúc cây không tồn tại chu trình
- Tổ chức một cấu trúc cây cho phép truy cập nhanh đến các phần
tử của nó
1 ĐỊNH NGHĨA :
- Cây nhị phân là một dạng cấu trúc cây quan trọng, mỗi nút của nó
chỉ có tối đa hai nút con
- Với mỗi nút trên cây nhị phân, cây con xuất phát từ nút con trái gọi
là cây con trái và cây con xuất phát từ nút con phải gọi là cây con phải của nó
Như vậy, cây nhị phân là cây có thứ tự
2 MỘT SỐ DẠNG ĐẶC BIỆT CỦA CÂY NHỊ PHÂN :
Trang 15a) b) c) d)
Trang 16- Các cây a), b), c), d) được gọi là cây nhị phân suy biến.
+ Cây a) được gọi là cây lệnh trái
+ Cây b) được gọi là cây lệnh phải
+ Cây c), d) được gọi là cây zic-zắc
- Cây e) được gọi là cây nhị phân hoàn chỉnh Như vậy, cây nhị
phân hoàn chỉnh là cây nhị phân đầy đủ mà tất cả các lá có cùng một mức
- Cây f) có các nút tối đa ở cả mọi mức nên gọi là cây nhị phân đầy
đủ cân bằng Đó là trường hợp đặc biệt của cây nhị phân hoàn chỉnh
Trang 17- Cây g) gọi là cây gần đầy, khác với cây e) ở chỗ các nút ở mức cuối không đạt về phía trái.
3 TÍNH CHẤT :
- Trong các cây nhị phân cùng có số lượng nút như nhau thì câynhị phân suy biến có chiều cao lớn nhất, cây nhị phân hoàn chỉnh hoặc câynhị phân gần đầy có chiều cao nhỏ nhất, loại cây này cũng là cây có dạng cânđối nhất
- Số lượng tối đa các nút mức k (k≥1) trên cây nhị phân là 2k-1
- Số lượng tối đa các nút trên cây nhị phân độ cao h là 2h-1 (h≥1)
2) Chứng minh bằng quy nạp :
Ta biết :
- Ở mức 1 : k=1, cây nhị phân có tối đa 1=20 nút
- Ở mức 2 : k=2, cây nhị phân có tối đa 2=21 nút
Giả sử kết quả đúng với mức k-1, nghĩa là ở mức này cây nhịphân có tối đa là 2k-2 nút Mỗi nút ở mức k-1 sẽ có tối đa hai con, do đó
2k-2 nút ở mức k-1 sẽ cho : 2k-2 * 2=2k-1 nút tối đa ở mức k (Tính chất 2được chứng minh)
3) Ta biết rằng chiều cao của cây là số mức lớn nhất có trên cây.Theo 2) ta suy ra số nút tối đa có trên cây nhị phân với chiều cao h là :
20 + 21 + 22 + +2h-1 = 2h-1
Trang 18CHƯƠNG II: CÂY NHỊ PHÂN TÌM KIẾM
I MỘT SỐ KHÁI NIỆM:
- Cây nhị phân tìm kiếm (Binary Search Tree) là một cấu trúc dữ
liệu rất thuận lợi cho bài toán tìm kiếm
- Cây nhị phân tìm kiếm là cây nhị phân trong đó dữ liệu được gán
với các nút và dữ liệu được sắp xếp theo khóa sao cho khóa tại mỗi nút của
cây lớn hơn khóa của các nút cây con bên trái và nhỏ hơn hoặc bằng khóa
của các nút cây con bên phải
- Nếu số nút trên cây là N thì chi phí tìm kiếm trung bình chỉ khoảng
log2N
- Cây tìm kiếm ứng với n khóa k1, k2, …, kn là cây nhị phân mà mỗi
nút đều được gán một khóa sao cho với mỗi nút k:
+ Mọi khóa trên cây con trái đều nhỏ hơn khóa trên nút k
+ Mọi khóa trên cây con phải đều lớn hơn khóa trên nút k
- Cây nhị phân tìm kiếm là một cấu trúc dữ liệu cơ bản được sử
dụng để xây dựng các cấu trúc dữ liệu trừu tượng hơn như các tập hợp, đa
Trang 19III CẤU TRÚC DỮ LIỆU:
Typedef struct NODE{
IV CÁC THAO TÁC TRÊN CÂY NHỊ PHÂN TÌM KIẾM:
1 Khởi tạo cây Binary Search Tree:
1.1 Khởi tạo cây Binary Search Tree:
Cho con trỏ quản lý địa chỉ nút gốc về con trỏ NULL void init (Node &root)
p→ left = NULL;
Trang 20p→ right = NULL;
p→ data = x;
}return (p);
}
1.3 Tạo cây nhị phân tìm kiếm:
- Ta có thể tạo cây nhị phân tìm kiếm bằng cách lặp lại quá trình thêm một phần tử vào một cây rỗng
void creatTree (Tree &root){
int x, n;
cout << “ nhap n= ”; cin>> n;
for (int i=1; i<=n; i++){
cout << “ nhap gia tri: ”; cin>> x;
insertTree (root.x);
}}
- Ví dụ về tạo cây nhị phân tìm kiếm:
Trang 213 18 29 50
Trang 222 Duyệt cây nhị phân tìm kiếm:
- Khi một cây nhị phân tìm kiếm được tạo ra, tất cả các nút có thểđược duyệt theo thứ tự giữa nhờ duyệt đệ quy cây con bên trái, in nút đangduyệt, rồi duyệt đệ quy cây con bên phải, tiếp tục làm như vậy với mỗi nút củacây trong quá trình đệ quy Với mọi cây nhị phân, cây có thể được duyệt theothứ tự trước hoặc theo thứ tự sau, cả hai cách đều hữu dụng với cây nhị phântìm kiếm
- Phép duyệt có độ phức tạp là Ω(n), vì nó phải duyệt qua tất cả cácnút Độ phức tạp trên cũng là O(n)
- Khi duyệt theo thứ tự giữa, trình tự các nút duyệt qua sẽ cho ta một dãy các nút theo thứ tự tăng dần của khóa
2.1 Duyệt theo thứ tự trước (Node - Left - Right):
Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con bên phải.void NLR (TREE root)
{
if (root!=NULL){
cout << root→ data<< “ “;
Trang 23NLR (root→ left);
NLR (root→ right);
}
}
2.2 Duyệt theo thứ tự giữa (Left - Node - Right):
Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phải.void LNR (TREE root)
{
if (root!=NULL){
LNR (root→ left);
cout << root→ data<< “ “;
LNR (root→ right);
}}
2.3 Duyệt theo thứ tự sau (Left - Right - Node):
Duyệt cây con bên trái, duyệt cây con bên phải, duyệt nút gốc.void LRN (TREE root)
{
if (root!=NULL){
LRN (root→ left);
LRN (root→ right);
cout << root→ data<< “ “;
}
Trang 243 Tìm một phần tử x trong cây:
Giải thuật tìm kiếm:
+ Đầu vào: Cây nhị phân tìm kiếm T và khóa K
+ Đầu ra: Kết luận K không có trong cây T hoặc xác định vị trí chứa khóa K
Đặt nút v ban đầu là gốc
(2) Kiểm tra khóa:
Nếu K bằng khóa dữ liệu tại v, nút v là vị trí chứa dữ liệu với khóa K, kết thúc
(3) Tìm vị trí lưu dữ liệu:
Nếu khóa K nhỏ hơn khóa dữ liệu tại v, sang bước (4)
Ngược lại sang bước (5)
- Thời gian tìm kiếm sẽ lớn nhất nếu khóa K không có trong cây T
và ta phải đi theo đường đi dài nhất từ gốc đến lá Như vậy, thời gian tìm
Trang 25kiếm cực đại sẽ tỉ lệ với độ cao của cây T Vì thế, nếu độ cao của cây thì
việc tìm kiếm sẽ rất nhanh
+ So sánh K với 63: K < 63, ta chuyển sang cây con trái
+ So sánh K với 27: K > 27, ta chuyển sang cây con phải
+ So sánh K với 51: K > 51, ta chuyển sang cây con phải
+ So sánh K với 58: K < 58, ta chuyển sang cây con trái
+ So sánh K với 57: K = 57, vậy tìm kiếm được thỏa như theo sơ
đồ trên
Nếu K = 30, quá trình tìm kiếm như sau:
+ So sánh K với 63: K < 63, ta chuyển sang cây con trái
+ So sánh K với 27: K > 27, ta chuyển sang cây con phải
+ So sánh K với 51: K < 51, ta chuyển sang cây con trái
+ So sánh K với 33: K < 33, ta chuyển sang cây con trái nhưng
cây con trái rỗng, vậy phép tìm kiếm không thỏa
Trang 26Nếu sau phép tìm kiếm không thỏa, ta chèn luôn K vào cây nhị
phân tìm kiếm (như ví dụ vừa xét, ta chèn khóa 30 vào thành con trái của
nút 33 như hình bên dưới) ta thấy phép chèn này thực hiện rất đơn giản
và không làm ảnh hưởng gì tới vị trí của các khóa hiện có trên cây, tính
chất của cây nhị phân tìm kiếm vẫn được bảo đảm Vậy trong giải thuật
tìm kiếm có thao tác chèn trên cây nhị phân tìm kiếm
if (root→ data = = x)return root;
if (root→ data > x)return searchNode ( root→ left, x);
return searchNode ( root→ right, x);
}
Trang 27return NULL;
}
3.2 Tìm theo không đệ quy:
NODE* searchNode (TREE root, int x){
TNODE *p = root;
While (p != NULL){
}
3.3 Thêm một nút vào cây Binary Search Tree:
- Việc thêm một phần tử x vào cây phải đảm bảo điều kiện ràngbuộc của cây nhị phân tìm kiếm Ta có thể thêm vào nhiều chỗ khác nhau trêncây, nhưng nếu thêm vào một nút ngoài sẽ là tiện lợi nhất do ta có thể thựchiện quá trình tương tự thao tác tìm kiếm Khi chấm dứt quá trình tìm kiếmcũng chính là lúc tìm được chỗ cần thêm
- Hàm insert trả về giá trị -1, 0, 1 khi không đủ bộ nhớ, gặp nút cũhay thành công
int insertNode (TREE &root, Data x){
Trang 28root = new Node;
if (root = NULL) return -1; //thiếu bộ
nhớ root→ data = x;
root→ left = root→ right = NULL;
return 1; //thêm vào thành công
Trang 2950
Trang 303.4 Nhận xét:
Rõ ràng, với giải thuật cây nhị phân tìm kiếm nêu trên, ta thấydạng cây nhị phân tìm kiếm dựng được hoàn toàn phụ thuộc vào dãy khóađưa vào Nếu là cây nhị phân hoàn chỉnh hoặc cây nhị phân gần đầy thì chiềucao của nó là log2(n+1) nên chi phí tìm kiếm có cấp độ lớn chỉ là O(log2n).Nếu là cây nhị phân suy biến (chẳng hạn dãy khóa đưa vào vốn đã có thứ tựsắp xếp rồi) không khác gì một danh sách tuyến tính mà tìm kiếm trên cây đóchính là tìm kiếm tuần tự với chi phí có cấp
O(n)
Tóm lại, số lần so sánh tối đa phải thực hiện để tìm phần tử k
là h, với h là chiều cao của cây Như vậy, thao tác tìm kiếm trên cây nhị phântìm kiếm có n nút tốn chi phí trung bình khoảng O(log2n)
Trang 311 Xóa nút này.
- Ví dụ: Chỉ đơn giản hủy X vì nó không móc nối đến phần tử
4.2 Trường hợp 2: X chỉ có một con (bên trái hoặc bên phải).
- Trước khi xóa X ta móc nối cha của X với con duy nhất của X
x v v
Trang 321 Gán liên kết từ cha của nó xuống con duy nhất của
4.3 Trường hợp 3: X có đủ hai con.
- Tìm w là node trước node x trên phép duyệt cây inorder (chính
là node cực phải của cây con bên trái của x)
Trang 33- Xóa node w cũ (giống trường hợp 1 hoặc 2 đã xét).
- Ta dùng cách hủy gián tiếp do X có đủ hai con
+ Thay vì hủy X ta tìm phần tử thế mạng Y Nút Y có tối đa mộtcây con
+ Thông tin lưu tại nút Y sẽ được chuyển lên lưu tại nút X.+ Ta tiến hành xóa hủy nút Y (xóa Y giống 2 trường hợp đầu)
- Có hai phần tử thỏa mãn yêu cầu:
+ Phần tử nhỏ nhất (trái nhất) trên cây con phải
+ Phần tử lớn nhất (phải nhất) trên cây con trái
- Việc chọn lựa phần tử nào là phần tử thế mạng hoàn toàn phụ thuộc vào ý thích của người lập trình
Ở đây, ta sẽ chọn phần tử phải nhất trên cây con trái làm phần tửthế mạng
- Ví dụ: Khi hủy phần tử X=18 ra khỏi cây, phần tử 23 là phần
tử thế mạng
Trường hợp 3: Hủy
44
18
Trang 3413 37 59 10
Trang 35- Hàm delNode trả về giá trị 1, 0 khi hủy thành công hoặc không
có X trong cây:
int delNode (TREE &root, Data x)
- Hàm searchStandFor tìm phần tử thế mạng cho nút p void searchStandFor (TREE &p, TREE &q)
if (root→ left = = NULL)
root = root→ right;
Trang 36if (root→ right = = NULL)
root = root→ left;
else //T chỉ đủ hai con
searchStandFor (p, root→ right);
delete p;
}//Tìm phần tử thế mạng cho nút pvoid searchStandFor (TREE &p, TREE &q){
if (q→ left)
searchStandFor (p, q→ left);
else{
p→ data = q→ data;
p = q;
q = q→ right;
}}
5 Hủy toàn bộ cây nhị phân tìm kiếm:
- Việc hủy toàn bộ cây có thể được thực hiện thông qua thao tácduyệt cây theo thứ tự sau Nghĩa là ta sẽ hủy cây con trái, cây con phải rồimới hủy nút gốc
void removeTree (TREE &root)
Trang 37if (root != NULL){
removeTree (root→ left);
removeTree (root→ right);
delete (root);
}}
Vì vậy, cần có cải tiến cấu trúc của cây tìm kiếm nhị phân để đạt được chi phí cho các thao tác là log2n