Cây tìm kiếm nhị phân

18 1.2K 5
Cây tìm kiếm nhị phân

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐHSP HÀ NỘI LỚP CHK15 – KHOA CNTT BÀI GIẢNG MÔN CẤU TRÚC DỮ LIỆU CÂY TÌM KIẾM NHỊ PHÂN KHÁI NIỆM TÌM KIẾM THÊM XOÁ GIẢNG VIÊN HƯỚNG DẪN PGS.TS LÊ KHẮC THÀNH HỌC VIÊN THỰC HIỆN NGUYỄN VIỆT HUỲNH MAI DUYỆT KHÁI NIỆM KHÁI NIỆM 1.CÂY 1.CÂY Cây là một tập hữu hạn các nút, trong đó có Cây là một tập hữu hạn các nút, trong đó có một nút đặc biệt gọi là gốc (root). Giữa các nút một nút đặc biệt gọi là gốc (root). Giữa các nút có một quan hệ phân cấp gọi là “quan hệ cha có một quan hệ phân cấp gọi là “quan hệ cha con”. con”. 2. CÂY NHỊ PHÂN 2. CÂY NHỊ PHÂN Cây nhò phâncây có thứ tự và có đặc điểm Cây nhò phâncây có thứ tự và có đặc điểm mọi nút trên cây có tối đa 2 con: mọi nút trên cây có tối đa 2 con:   Cây con trái Cây con trái   Cây con phải Cây con phải KHÁI NIỆM(tt) KHÁI NIỆM(tt) 3. CÂY TÌM KIẾM NHỊ PHÂN 3. CÂY TÌM KIẾM NHỊ PHÂN - Cây tìm kiếm nhò phân được tổ chức theo một cây nhò - Cây tìm kiếm nhò phân được tổ chức theo một cây nhò phân. phân. - Cây tìm kiếm nhò phân có thể được biểu diễn bởi một - Cây tìm kiếm nhò phân có thể được biểu diễn bởi một cấu trúc dữ liệu nối kết. cấu trúc dữ liệu nối kết. - Ngoài một trường key, mỗi nút chứa một trường left, - Ngoài một trường key, mỗi nút chứa một trường left, right và p trỏ đến các nút tương ứng với con trái, con phải right và p trỏ đến các nút tương ứng với con trái, con phải và cha của nó. Nếu thiếu một con hoặc cha trường thích và cha của nó. Nếu thiếu một con hoặc cha trường thích hợp sẽ chứa giá trò NIL. Nút gốc là nút duy nhất trong cây hợp sẽ chứa giá trò NIL. Nút gốc là nút duy nhất trong cây có trường cha là NIL. có trường cha là NIL. - Các khoá trong cây tìm kiếm nhò phân được lưu trữ - Các khoá trong cây tìm kiếm nhò phân được lưu trữ theo tính chất sau: theo tính chất sau: - Cho x là một nút trong cây tìm kiếm nhò phân. Nếu y - Cho x là một nút trong cây tìm kiếm nhò phân. Nếu y là một nút trong cây con trái của x, thì key[y] ≤ key[x]. là một nút trong cây con trái của x, thì key[y] ≤ key[x]. Nếu y là một nút trong cây con phải của x, thì key[x] ≤ Nếu y là một nút trong cây con phải của x, thì key[x] ≤ key[y]. key[y]. 0 KHÁI NIỆM(tt) KHÁI NIỆM(tt) 4. VÍ DỤ CÂY TÌM KIẾM NHỊ PHÂN 4. VÍ DỤ CÂY TÌM KIẾM NHỊ PHÂN 1 4 4 5 1080 1 4 4 5 108 Chọn nút số 4 làm nút gốc Các nút con là 1 0 4 5 8 10 Chọn nút số 0 làm nút gốc Các nút con là 1 5 4 4 8 10 0 1 4 4 5 108 DUYỆT CÂY DUYỆT CÂY 1. Duyệt theo thứ tự trước (NODE-LEFT-RIGHT) NLR_TREE(x) 1. IF X<>NIL THEN 2. PRINT key(x) 3. NLR_TREE(Left[x]) 4. NLR_TREE(Right[x]) 0 1 4 4 5 10 8 4 Kết quả duyệt: 4 1 1 0 0 4 4 5 5 8 8 10 10 Ý tưởng: Thăm nút gốc sau đó thăm các nút của cây con trái rồi đến cây con phải DUYỆT CÂY DUYỆT CÂY 2. Duyệt theo thứ tự giữa (LEFT-NODE-RIGHT) LNR_TREE(x) 1. IF X<>NIL THEN 2. LNR_TREE(Left[x]) 3. PRINT key(x) 4. LNR_TREE(Right[x]) 0 1 4 4 5 10 8 4 Kết quả duyệt: 4 1 1 0 0 4 4 5 5 8 8 10 10 Ý tưởng: Thăm các nút của cây con trái sau đó thăm nút gốc rồi đến cây con phải DUYỆT CÂY DUYỆT CÂY 3. Duyệt theo thứ tự sau (LEFT- RIGHT- NODE) LRN_TREE(x) 1. IF X<>NIL THEN 2. LRN_TREE(Left[x]) 3. LRN_TREE(Right[x]) 4. PRINT key(x) 0 1 4 4 5 10 8 4 Kết quả duyệt: 4 1 1 0 0 4 4 5 5 8 8 10 10 Ý tưởng: Thăm các nút của cây con trái sau đó thăm đến cây con phải rồi đến nút gốc TÌM KIẾM TRÊN CÂY TÌM KIẾM TRÊN CÂY SEARCHNODE(x,k) 1. While x<>NIL và k<>key[x] 2. Do if k<key[x] then 3. x:=left(x) 4. else 5. x:=right(x) 6. return x 13 18 44 37 88 71 99 Ý tưởng: Cho một biến trỏ đến gốc của cây và một khoá k. Thủ tục tìm kiếm SEARCHNODE trả về một biến trỏ đến một nút có khoá k nếu như nó tồn tại, nếu không nó trỏ về NIL 23 40 15 59 55 Ví dụ: Tìm nút có khoá 55 So sánh 55 với nút gốc 55 > 44 55 < 88 55 < 59 55 = 55 Đã tìm thấy ! THÊM NÚT VÀO CÂY THÊM NÚT VÀO CÂY 1. 1. Ý tưởng Ý tưởng : : - Khi thêm một giá trò mới v vào một cây tìm kiếm nhò phân T, ta dùng thủ tục TREE-INSERT. - Thủ tục TREE-INSERT được truyền qua một nút z , với key[z]=v, left[z]=NIL, và right[z]=NIL. Thủ tục sửa đổi T và vài trường của z theo cách thức mà z được truyền vào một vò trí thích hợp trong cây. - Thủ tục TREE-INSERT bắt đầu tại nút gốc của cây và lần theo một lộ trình đi xuống. Biến trỏ x lần theo lộ trình, và biến trỏ y được duy trì dưới dạng cha của x. Sau khi khởi tạo dòng lặp while trong các dòng 3-7 sẽ khiến hai biến trỏ này dời xuống, đi theo con trái hay phải tùy thuộc vào phép so sánh của key[z] với key[x], cho đến khi x được ấn đònh là NIL. NIL là vò trí ở đó ta muốn đặt mục đầu vào z. Các dòng 8-13 ấn đònh các biến trỏ khiến z được chèn. THEÂM NUÙT VAØO CAÂY (tt) THEÂM NUÙT VAØO CAÂY (tt) TREE-INSERT(T,z) 1. y:=NIL 2. x:= root[T] 3. while x <> NIL 4. do y:=x 5. if key[z]<key[x] 6. then x :=left[x] 7. else x := right[x] 8. p[z] :=y 9. if y=NIL 10. then root[T]:= z 11. else if key[z]< key[y] 12. then left[y]:=z 13. else right[y]:=z [...]... key[x] thủ tục dưới đây trả về phần tử kế vò của một nút x trong một cây tìm kiếm nhò phân nếu nó tồn tại, và NIL nếu x có khóa lớn nhất trong cây TREE-SUCCESSOR(x) 1 if right[x] NIL 2 then return TREE-MINIMUM(right[x]) 3 else y:= p[x] 4 while y NIL và x=right[y] 5 do x:=y 6 y:=p[y] 7 return y XOÁ NÚT TRÊN CÂY TKNP (tt) Ví dụ với cây bên dưới: Phần tử kế vò của nút có khóa 40 là nút có khóa 44 Phần... dưới: Phần tử kế vò của nút có khóa 40 là nút có khóa 44 Phần tử kế vò của nút có khóa 44 là nút có khóa 55 44 88 18 13 15 37 23 99 59 40 55 71 XOÁ NÚT TRÊN CÂY TKNP (tt) 2 XÓA NÚT TRÊN CÂY Thủ tục để xóa một nút z đã cho ra khỏi cây tìm kiếm nhò phân chấp nhận một biến trỏ đến z dưới dạng một đối số Thủ tục xét ba trường hợp: - Nếu z không có các con, ta sửa đổi cha của nó là p[z] bằng NIL - Nếu nút...THÊM NÚT VÀO CÂY (tt) Ví dụ: Thêm vào cây T một nút z, với key[z]=12, left[z]=NIL, right[z]=NIL Bắt đầu tại nút gốc, con trỏ x đi xuống, y con trỏ y duy trì dạng cha của x x Nút Z x 12 NIL x NIL x y 44 y 88 18 13 37 15 Nút Z được thêm vào 23 99 59 40 55 71 XOÁ NÚT TRÊN CÂY TKNP 1 PHẦN TỬ KẾ VỊ Nếu tất cả các khóa điều riêng biệt, phần tử kế... 14-16 nội dung của z 15 then key[z] :=key[y] được dời từ y sang z 16.return y XOÁ NÚT TRÊN CÂY TKNP (tt) 1 TRƯỜNG HP Z KHÔNG CÓ NÚT CON 44 88 18 13 37 NIL23 15 Z Nút 15 đã được xoá! 99 59 40 55 71 XOÁ NÚT TRÊN CÂY TKNP(tt) 2 TRƯỜNG HP Z CÓ 1 NÚT 44 88 18 13 Nút 88 đã được xoá! Z 93 37 15 23 59 40 55 98 71 XOÁ NÚT TRÊN CÂY TKNP (tt) 3 TRƯỜNG HP Z CÓ ĐỦ 2 NÚT CON 44 Nút 18 đã được xoá! Z 88 18 13 93 37 33... "nối khử" z bằng cách tạo một nối kết mới giữa con của nó và cha của nó - Nếu nút có hai con, ta nối khử phần tử kế vò y của z, không có con trái và thay nội dung của z bằng nội dung của y XOÁ NÚT TRÊN CÂY TKNP (tt) TREE-DELETE(T,z) 1.if left[z]=NIL or right[z]=NIL 1-3 xác đònh nút y để khử 2 then y:=z 3 else y:= TREE-SUCCESSOR(z) 4.if left[y] NIL 4-6 ấn đònh x dựa trên y 5 then x := left[y] 6 else . phải Cây con phải KHÁI NIỆM(tt) KHÁI NIỆM(tt) 3. CÂY TÌM KIẾM NHỊ PHÂN 3. CÂY TÌM KIẾM NHỊ PHÂN - Cây tìm kiếm nhò phân được tổ chức theo một cây nhò - Cây. nhò - Cây tìm kiếm nhò phân được tổ chức theo một cây nhò phân. phân. - Cây tìm kiếm nhò phân có thể được biểu diễn bởi một - Cây tìm kiếm nhò phân có thể

Ngày đăng: 05/06/2013, 01:26

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan