Tải bản đầy đủ (.pdf) (69 trang)

(Luận văn tốt nghiệp) cấu trúc dữ liệu cây đỏ đen và mô phỏng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (932.74 KB, 69 trang )

ĐẠ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
Đề tài:

CẤU TRÚC DỮ LIỆU CÂY ĐỎ ĐEN
VÀ MÔ PHỎNG

Giáo viên hướng dẫn
Sinh viên thực hiện
Lớp

: PGS.TSKH. Trần Quốc Chiến
: Phan Thị Như Ngọc
: 08SPT

Đà Nẵng - 5/ 2012

Luan van


LỜ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 gian
qua đã tận tâm giảng dạy, hướng dẫn tạo mọi điều kiện
thuậ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ện
Phan Thị Như Ngọc

Luan van


Ý 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

Luan van



MỤ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

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

1.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 tồ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

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

2.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

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

LỜ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ệu
trong máy tính sao cho nó có thể sử dụng một cách hiệu quả. Một cấu
trú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ên
trong đời sống hằng ngày cũng như trong xử lý Tin học. Vấn đề tìm kiếm
xét một cách tổng qt, 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 tốn tìm kiếm có thể được phát
biể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 ứng
bằ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 hồn
thà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ếm
khơ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ìm kiế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ớ ngồi là
tìm kiếm ngồi. Đối với tìm kiếm trong, tìm kiếm nhị phân là phương pháp

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

tìm kiếm khá thơng dụng, chi phí ít, đạt kết quả tốt. Tuy nhiên khi sử dụng
tìm kiếm nhị phân dãy khoá đã phải được sắp xếp rồi, nghĩa là thời gian
chi phí cho sắp xếp cũng phải kể đến. Nếu dãy khố ln 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ùng

vớ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 trong
việc lưu trữ và tìm kiếm dữ liệu. Song cây đỏ đen có những đặc tính riêng
mà nhờ đó nó đã làm nổi bật những điểm mạnh của mình. Thuật tốn
quan trọng trong cây cân bằng. Trên cơ sở đó với sự định hướng củ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 ”.
II. MỤC TIÊU NHIỆM VỤ:
- Đề 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ìm kiếm trong bài tốn tìm kiếm.
- Thực hiện nghiên cứu và mơ phỏng các phép tố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.

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

- 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 tố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: định
nghĩ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ác
phép tố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ấu
trú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

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

CHƯƠ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 Arthur
Cayley 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 tốn trong nhiều lĩnh vực
khác nhau 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ững tậ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 đó.
- Mức (gốc (T))=0.
* Ví dụ : Đồ thị sau là cây

V
1

V

V

2

3

V

V


V

V

4

5

6

7

+ Ta chọn V1 là gốc có mức 0 thì V2, V3 là những đỉnh mức 1, các
đỉnhV4, V5, V6, V7 có mức 2, và chiều cao của cây là 2.
- Rừng là đồ thị mà mỗi thành phần liên thông là cây.

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

- 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 con
tố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.
- Nút gốc là nút khơng có nút cha.
- Các nút khơng có nút con được gọi là nút lá.
- Nút nhánh là nút có bậc khác 0 và khơng phải là gốc.
- Ta quy ước: Một cây khơng có nút nào được gọi là cây rỗng (null
tree).
- Độ dài đường đi từ gốc đến nút x: Px = số cạnh cần đi qua kể từ
gốc đến x.

2. SƠ ĐỒ CẤU TRÚC CÂY:
(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Gốc

A

Cạnh

Nút
C


B

G

H

D

E

3. ỨNG DỤNG CẤU TRÚC CÂY:

F



- Xây dựng các thuật tốn rất có hiệu quả để định vị các phần tử
trong một danh sách.
- Xây dựng các mạng máy tính với chi phí rẻ nhất cho các đường
điện thoại nối các máy phân tán.
- Cây cũng được dùng để tạo ra các mã có hiệu quả để lưu trữ và
truyền dữ liệu.
- Cấu trúc cây được ứng dụng trong các giải thuật tìm kiếm, giải
thuật sắp xếp và nhiều bài toán khác.
- Cây dùng để biểu diễn bài toán quyết định (cây quyết định), biểu
diễn q trình tính tốn các biểu thức đại số.

4. 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:


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

BB-Electronic
Corp

Kinh
doanh

R&D

Sản
xuất

Tài
vụ

Nội
địa

Quốc
tế

Châu
Âu


Mỹ

TV

CD

Amplie
r

Các
nước

4.2. Mục lục một quyển sách:

Student
Guide

Giới
thiệu

Điể
m

Thực
hành

Bài
tập

Chương trình

mẫu

Mơi
trường

Thi

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.

+

+

/

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

x

Luan *van u

v


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

5. 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ó.

II. TÌM HIỂU CÂY NHỊ PHÂ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 :

A
B
C

A

A

A
B

B

B

C

C


C

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

D
a)

D

D

D

Luan van
b)

c)

d)


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

A

A

B


C

D
H

E
I

F

B
G

D

C

E

A

J

F

G

f)

e)

B

D

E

J

-

C
G

F

g)

I

H

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.

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

- 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ây
nhị phân suy biến có chiều cao lớn nhất, cây nhị phân hồn chỉnh hoặc
cây nhị 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).

 Chứng minh :
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.

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

CHƯƠ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 tập hợp, các dãy kết hợp.

II. SƠ ĐỒ CÂY NHỊ PHÂN TÌM KIẾM:
44

Cây con
trái

Cây con
phải

18

88

13

37

15

23


10
8

59

40

55

71

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

III. CẤU TRÚC DỮ LIỆU:
Typedef struct NODE
{
int data;
NODE* left;
NODE* right;
};
Typedef struct NODE* TREE;
TREE root;

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)
{
root = NULL;
}
1.2. Tạo Node:
Node* GetNode (int x)
{
p = new Node;
if (p!= NULL)
{
p→ left = NULL;

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

p→ 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:
25 37 10 18 29 50 3 1 6 5 12 20 35 13 32
41

25

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

10

37

Luan van
3

18

29

50



(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

2. 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
đang duyệ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ủa cây trong quá trình đệ quy. Với mọi cây nhị phân, cây có thể
được duyệt theo thứ tự trước hoặc theo thứ tự sau, cả hai cách đều hữu
dụng với cây nhị phân tì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ác
nú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<< “ “;

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong


NLR (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<< “ “;
}
(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van



(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

}
3. 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
+ Phương pháp:
(1) Xuất phát:
Đặ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).
(4) Tìm bên trái:
Nếu v khơng có nút con trái, kết luận: khóa K khơng có
trong cây T, kết thúc.
Ngược lại, đặt v là nút con trái của v, quay lại (2).
(5) Tìm bên phải:
Nếu v khơng có nút con phải, kết luận: khóa K khơng có
trong cây T, kết thúc.
Ngược lại, đặt v là nút con phải của v, quay lại (2).
 Nhận xét:
- 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
(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

kiế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.
* Ví dụ về tìm một phần tử K trong cây:

57 < 63
63

27

13

51

26

80

57 > 27

33

57 = =

57

57 >
51
58

57

70

57 <
58

92

82

60

 Nếu K = 57 ta sẽ thực hiện:
+ 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.

(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Nếu sau phép tìm kiếm khơng thỏa, ta chèn ln 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.
63

30 < 63
27

13

51

26

80

30 > 27


30 <
33

30 <
51

33

70

58

Chèn 30
30
vào

57

92

82

60

3.1. Tìm theo đệ quy:
NODE* searchNode (TREE root, int x)
{
if (root != NULL)
{

if (root→ data = = x)
return root;
if (root→ data > x)
return searchNode ( root→ left, x);
return searchNode ( root→ right, x);
}
(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

return NULL;
}
3.2. Tìm theo khơng đệ quy:
NODE* searchNode (TREE root, int x)
{
TNODE *p = root;
While (p != NULL)
{
if (x = = p→ data) return p;
else
if (x < p→ data) p = p→ left;
else p = p→ right;
}
return 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àng
buộ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ên cây, nhưng nếu thêm vào một nút ngoài sẽ là tiện lợi nhất do ta có
thể thực hiện q trình tương tự thao tác tìm kiếm. Khi chấm dứt q
trình tìm kiếm cũ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)
{
(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong(Luan.van.tot.nghiep).cau.truc.du.lieu.cay.do.den.va.mo.phong

Luan van


×