Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Cây nhị phân tìm kiếm - Trần Minh Thái
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Cây nhị phân tìm kiếm - Trần Minh Thái", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_4_cay_nhi_ph.pptx
Nội dung text: Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Cây nhị phân tìm kiếm - Trần Minh Thái
- Chương 4. Cây nhị phân tìm kiếm Trần Minh Thái Email: minhthai@itc.edu.vn Website: www.minhthai.edu.vn 1
- Nội dung 1. Khái niệm 2. Đặc điểm 3. Định nghĩa kiểu dữ liệu 4. Các lưu ý khi cài đặt 5. Các thao tác 2
- Khái niệm ▪Bậc của một nút: là số cây con của nút đó 2 ▪Nút gốc: là nút không có 2 2 nút cha ▪Nút lá: là nút có bậc 0 1 1 0 bằng 0 ▪Nút nhánh: là nút có bậc 0 0 khác 0 và không phải là gốc 3
- Khái niệm ▪Chiều dài đường Mức 1 đi đến nút x: là số nhánh cần đi qua Mức 2 kể từ gốc đến x Mức 3 ▪Độ cao của cây: Độ sâu (mức) của nút lá thấp nhất Mức 4 x 4
- Đặc điểm cây nhị phân tìm kiếm ▪Là cây nhị phân ▪Giá trị của một node bất 7 kỳ luôn lớn hơn giá trị 3 36 của tất cả các node bên trái và nhỏ hơn giá trị tất 1 6 15 40 cả các node bên phải ➔Nút có giá trị nhỏ nhất 4 23 nằm ở trái nhất của cây ➔Nút có giá trị lớn nhất nằm ở phải nhất của cây 5
- Định nghĩa kiểu dữ liệu Giá trị Key Nút TNODE Trỏ trái Trỏ phải pLeft pRight typedef struct TNODE { Key; struct TNODE *pLeft, *pRight; } *TREE; 6
- Ví dụ khai báo typedef struct TNODE { int Key; struct TNODE *pLeft, *pRight; } *TREE; 7
- Các lưu ý khi cài đặt Bước 1: Khai báo kiễu dữ liệu biểu diễn cây Bước 2: Xây dựng hàm đưa dữ liệu (nhập) vào cây Bước 3: Xây dựng các thao tác duyệt, tìm kiếm, huỷ, 8
- Cấu trúc chương trình Khai báo cấu trúc cây Khởi tạo cây rỗng Xây dựng cây Các thao tác Hủy cây 9
- Các thao tác 1. Tạo cây 2. Duyệt cây 3. Cho biết các thông tin của cây 4. Tìm kiếm 5. Xoá node trên cây 10
- Tạo cây 7 36 3 1 6 4 15 40 40153613746 ➢ Nếu node cần thêm nhỏ hơn node đang xét thì thêm về bên trái ➢ Ngược lại thì thêm về bên phải 11
- Hàm tạo cây int ThemNut (TREE & t, int x) { if(t!=NULL) { if(x==t->Key) return 0; else { if(x Key) ThemNut(t->pLeft, x); else ThemNut(t->pRight, x); } } else { t=new TNODE; if(t==NULL) return -1; t->Key=x; t->pLeft=t->pRight=NULL; return 1; } } 12
- Duyệt cây Thứ tự trước (NLR) Thứ tự giữa (LNR) Thứ tự sau (LRN) 13
- 7 Bước Kết quả duyệt theo thứ tự NLR 1 7 L7 R7 3 36 2 3 L3 R3 R7 3 1 R3 R7 1 6 15 40 4 6 L6 R7 4 23 5 4 R7 6 36 L36 R36 7 15 R15 R36 8 23 R36 9 40 KQ 7 3 1 6 4 36 15 23 40 14
- Hàm duyệt NLR Tại node t đang xét, nếu void NLR (TREE t) khác rỗng thì { if(t!=NULL) ▪In giá trị của t { ▪Duyệt cây con bên trái cout Key pLeft); của t theo thứ tự NLR NLR(t->pRight); ▪Duyệt cây con bên } phải của t theo thứ tự } NLR 15
- Bài tập Vẽ cây nhị phân tìm kiếm theo thứ tự nhập từ trái sang phải và duyệt cây theo thứ tự trước: ▪27; 19; 10; 21; 35; 25; 41; 12; 46; 7 ▪H; B; C; A; E; D; Z; M; P; T ▪Huế; Đà Nẵng; Hà Nội; Vĩnh Long; Cần Thơ; Sóc Trăng; Nha Trang; Đồng Nai; Vũng Tàu; An Giang; Tiền Giang; Bình Dương; Hải Dương 16
- Bước Kết quả duyệt theo thứ tự LNR 7 1 L7 7 R7 2 L3 3 R3 7 R7 3 36 3 1 3 R3 7 R7 4 3 R3 7 R7 1 6 15 40 5 L6 6 7 R7 6 4 6 7 R7 4 23 7 6 7 R7 8 7 R7 9 L36 36 R36 10 15 R15 36 R36 11 23 36 R36 12 36 R36 13 40 KQ 1 3 4 6 7 15 23 36 40 17
- Hàm duyệt LNR Tại node t đang xét, nếu void LNR (TREE t) khác rỗng thì { if(t!=NULL) ▪Duyệt cây con bên trái { của t theo thứ tự LNR LNR(t->pLeft); ▪In giá trị của t cout Key pRight); phải của t theo thứ tự } LNR } 18
- Bước Kết quả duyệt theo thứ tự LRN 7 1 L7 R7 7 2 L3 R3 3 R7 7 3 36 3 1 R3 3 R7 7 4 L6 6 3 R7 7 1 6 15 40 5 4 6 3 R7 7 6 6 3 R7 7 4 23 7 3 R7 7 8 L36 R36 36 7 9 R15 15 R36 36 7 10 23 15 R36 36 7 11 15 R36 36 7 12 40 36 7 13 36 7 14 7 KQ 1 4 6 3 23 15 40 36 7 19
- Hàm duyệt LRN Tại node t đang xét, nếu void LRN (TREE t) khác rỗng thì { ▪Duyệt cây con bên trái của t if(t!=NULL) theo thứ tự LRN { ▪Duyệt cây con bên phải của LRN(t->pLeft); t theo thứ tự LRN LRN(t->pRight); cout Key<<“ “; ▪In giá trị của t } } 20
- Bài tập ▪Bài 4 Vẽ cây nhị phân tìm kiếm theo thứ tự nhập: 27, 19, 10, 21, 3, 15, 41, 50, 30, 27 Hãy duyệt cây trên theo thứ tự giữa ▪Bài 5 Vẽ cây nhị phân tìm kiếm theo thứ tự nhập: H, B, C, A, E, D, T, M, X, O Hãy duyệt cây trên theo thứ tự sau 21
- Vấn đề cần quan tâm Tạo cây từ kết quả duyệt NLR ▪Chọn giá trị đầu tiên làm node gốc ▪Lần lượt đưa các giá trị còn lại từ trái sang phải vào cây theo nguyên tắc tạo cây Tạo cây từ kết quả duyệt LRN ▪Chọn giá trị cuối cùng làm node gốc ▪Lần lượt đưa các giá trị còn lại từ phải sang trái vào cây theo nguyên tắc tạo cây 22
- Vấn đề cần quan tâm Tạo cây từ kết quả duyệt LNR ▪ Gọi r: Số lượng giá trị cho trước ▪ Gọi m = r div 2: Giá trị ở giữa ▪ Chọn giá trị thứ m làm node gốc ▪ Lần lượt đưa các giá trị bắt đầu từ vị trí m-1 lùi về trái vào cây theo nguyên tắc tạo cây ▪ Lần lượt đưa các giá trị bắt đầu từ vị trí m+1 đến cuối vào cây theo nguyên tắc tạo cây 23
- Bài tập Bài 6 Vẽ cây nhị phân tìm kiếm T biết rằng khi duyệt cây T theo thứ tự NLR thì được dãy sau: 9, 4, 1, 3, 8, 6, 5, 7, 10, 14, 12, 13, 16, 19 ▪ Hãy duyệt cây T trên theo thứ tự LRN ▪Liệt kê các nút lá của cây. Liệt kê các nút nhánh của cây 24
- Bài tập Bài 7 Vẽ cây nhị phân tìm kiếm T biết rằng khi duyệt cây T theo thứ tự LRN thì được dãy sau: 1, 4, 7, 5, 3, 16, 18, 15, 29, 25, 30, 20, 8 ▪Hãy duyệt cây T trên theo thứ tự NLR ▪Cây T có chiều cao là bao nhiêu? Tìm các đường đi từ gốc có độ dài là 4 trên cây 25
- Hàm nhập dữ liệu vào cây void Nhap(TREE &t) { int x; do{ cout >x; int kq=ThemNut(t, x); if(kq==0||kq==-1) break; }while (true); } 26
- Hàm main gọi thao tác duyệt LNR void main() { TREE t; t=NULL; Nhap(t); cout<<“Duyet cay theo thu tu giua: “; LNR(t); Huy(t); } 27
- Tìm kiếm 1. Tìm x 2. Tìm min 3. Tìm min của cây con bên phải 4. Tìm max 5. Tìm max của cây con bên trái 28
- Ví dụ tìm x = 23 7 3 36 1 6 15 40 4 23 29
- Xóa node trên cây 7 3 36 1. Node lá 2. Node có 1 cây con 1 6 15 40 3. Node có 2 cây con 4 23 30
- Xóa node lá 7 3 36 Xóa 1 1 6 15 40 Xóa 23 4 23 31
- Xóa node 1 cây con 7 3 36 Xóa 6 Xóa 15 1 64 1523 40 4 23 32
- Xóa node 2 cây con Tìm node thế mạng 7 ▪Cách 1: Tìm node trái nhất của cây con phải 3 2336 ▪Cách 2: Tìm node phải nhất của cây con trái 1 6 15 40 Xóa 36 (Cách 2) 4 23 16 33
- Cho dãy số theo thứ tự nhập từ trái sang phải: 20, 15, 35, 30, 11, 13, 17, 36, 47, 16, 38, 28, 14 ▪Vẽ cây nhị phân tìm kiếm cho dãy số trên ▪Cho biết kết quả duyệt cây trên theo thứ tự trước, giữa và sau ▪Cho biết độ cao của cây, các nút lá, các nút có bậc 2 ▪Vẽ lại cây sau khi thêm nút: 25 và 91 ▪Trình bày từng bước và vẽ lại cây sau khi lần lượt xoá các nút: 11 và 35 34
- Viết hàm 1. In ra các node có giá trị chẵn 2. In ra các node có giá trị lớn hơn x 3. Độ cao của cây 4. Số node của cây 5. Tìm min, max 6. Tìm node có giá trị x 35
- Viết hàm 7. Số node lá (node bậc 0) 8. Số node có 1 cây con (node bậc 1) 9. Số node chỉ có 1 cây con phải 10. Số node có 1 cây con trái 11. Số node 2 cây con (node bậc 2) 12. Các node trên từng mức của cây 13. Độ dài đường đi từ gốc đến node x 36