1 / 42

Đề Tài Báo Cáo:

Đề Tài Báo Cáo:. CÂY NHỊ PHÂN TÌM KIẾM. CÂY AVL. Các thành viên trong nhóm: 1. ĐẶNG HỒNG HẠNH 2. HOÀNG NGỌC PHƯƠNG DUNG 3. LÊ TRẦN PHƯƠNG VI. Ngôn ngữ sử dụng: C++ Môi trường làm việc: BORLANDC Tài liệu tham khảo: 1. Nhập môn cấu trúc dữ liệu và thuật toán

claral
Download Presentation

Đề Tài Báo Cáo:

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Đề Tài Báo Cáo: CÂY NHỊ PHÂN TÌM KIẾM CÂY AVL

  2. Các thành viên trong nhóm: 1. ĐẶNG HỒNG HẠNH 2. HOÀNG NGỌC PHƯƠNG DUNG 3. LÊ TRẦN PHƯƠNG VI Ngôn ngữ sử dụng:C++ Môi trường làm việc:BORLANDC Tài liệu tham khảo: 1. Nhập môn cấu trúc dữ liệu và thuật toán (GS.TS.Hoàng Kiếm) 2. C++ & Lập trình hướng đối tượng (GS.Phạm Văn Ất) 3. Cấu trúc dữ liệu và thuật giải (Th.Sĩ Nguyễn Mạnh Cường) - Nhiệm vụ từng thành viên: Viết Code: Phương Dung + Hồng Hạnh Soạn Powerpoint: Phương Dung+Hồng Hạnh+Phương Vi

  3. Phần 1: CÂY NHỊ PHÂN TÌM KIẾM

  4. Định nghĩa • Cây nhị phân tìm kiếm • Cây nhị phân: là cây mà tại mỗi nút có tối đa 2 con • Có một node gọi là gốc (root) và 2 cây con gọi là cây con trái và cây con phải • Giá trị của những nút bên trái nhỏ hơn giá trị của những nút bên phải. • Ví dụ: • Cây rỗng: • Cây có 1 node: là node gốc • Cây có 2 node:

  5. 25 10 37 3 18 29 50 1 6 12 20 35 41 5 13 32 Ví dụ CNP:

  6. Khai báo CNP: typedef struct TagNode { int info; struct TagNode *pL,*pR; int x,y; }tNode,Node,*pNode; typedef tNode *tree;

  7. Các thao tác: • Nhập xuất cây. • Thêm phần tử X trong cây. • Tìm phần tử X trong cây. • Hủy phần tử X trong cây. • Đếm số nút của cây. • Đếm số lá của cây. • Đếm số nút có 1 con. • Đếm số nút có 2 con. • Chiều cao của cây. • Hủy toàn bộ cây NPTK.

  8. Phép duyệt cây • Duyệt qua từng node của cây (mỗi node 1 lần) • Cách duyệt: 1.NLR (Tiền thứ tự) 2.LNR(Trung thứ tự) 3.LRN(hậu thứ tự)

  9. 1.NLR(Tiền thứ tự) void NLR(TREE T) { if(T!=NULL) { cout<<T->Info<<" ";//thamnut T NLR(T->pLeft); NLR(T->pRight); } }

  10. Phép duyệt cây_ NLR: 20 8 26 3 15 21 29 1 5 9 16 25 28 4 12 22 28 Kết quả: 20 8 3 1 5 4 15 9 12 16 26 21 25 22 29

  11. 2. NLR(Trung thứ tự) void LNR(TREE T) { if(T!=NULL) { LNR(T->pLeft); cout<<T->Info<<" ";//thamnut T LNR(T->pRight); } }

  12. Phép duyệt cây_LNR 15 6 21 3 10 16 25 1 5 7 13 19 22 4 8 18 13 15 16 18 19 21 22 25 Kết quả: 1 3 4 5 6 7 8 10

  13. 3.LRN (Hau thu tu) void LRN(TREE T) { if(T!=NULL) { LRN(T->pLeft); LRN(T->pRight); cout<<T->Info<<" ";//thamnut T } }

  14. Ví dụ về phép duyệt cây LRN 15 8 25 3 12 19 29 1 5 9 13 18 26 4 11 16 Kết quả: 1 4 5 15 3 11 9 13 12 8 16 18 19 26 29 25

  15. Tìm kiếm trên CNP: • Chọn hướng tìm theo tính chất của CNP: • So sánh với node gốc, nếu đúng thì tìm thấy • Tìm bên nhánh trái (hay phải) nếu khóa cần tìm nhỏ hơn (hay lớn hơn) khóa của node gốc tNode *SearchNode(tree T,int X) { if(T) { if(T->info==X) return T; if(T->info>X) return SearchNode(T->pL,X); else return SearchNode(T->pR,X); } return NULL; }

  16. Giải thuật tìm kiếm trên BST Algorithm searchNode Input: T là node gốc và X là khóa cần tìm Output: node tìm thấy 1. if (cây rỗng) 1.1. return -1 //khong tim thay 2. if (X trùng khóa với T) 2.1. return 1 // tim thay 3. if (X có khóa nhỏ hơn khóa của T) 3.1. Tìm bên nhánh trái của T 4. else 4.1. Tìm bên nhánh phải của T End searchNode

  17. Ví dụ tìm kiếm trên CNP 25 10 37 3 18 29 50 1 6 12 20 35 41 5 13 32 Giống nhau Node gốc nhỏ hơn Node gốc lớn hơn Khác nhau Số node duyệt: 5 Số lần so sánh: 9 Tìm kiếm 13 Tìm thấy

  18. Ví dụ tìm kiếm trên CNP 25 10 37 3 18 29 50 1 6 12 20 35 41 5 13 32 Khác nhau Node gốc nhỏ hơn Node gốc lớn hơn Số node duyệt: 5 Số lần so sánh: 10 Tìm kiếm 14 Không tìm thấy

  19. Giải thuật thêm vào CNP: NHẬP: node gốc và dữ liệu cần thêm vào XUẤT: CNP sau khi thêm vào 1. if (cây rỗng) 1.1. Thêm vào tại vị trí này 2. if (dl trùng khóa với nút gốc) 2.1. return 0 3. if (dl có khóa nhỏ hơn khóa của nút gốc) 3.1. Thêm vào bên nhánh trái của nút gốc 4. else 4.1. Thêm vào bên nhánh phải của nút gốc End.

  20. Giải thuật thêm vào CNP int InsertNode(tree &T,int gt) { y+=1; if(T){ if(T->info ==gt)//cout<<"du lieu da co"; return 0; else if(gt< T->info){ x-=(getmaxx()/(y*4)+1); if(x<0) x = 15; InsertNode(T->pL,gt);} else{ x+=(getmaxx()/(y*4)+1); if(x>getmaxx()){ x = getmaxx()-15;} InsertNode(T->pR,gt); } } else { T = GetNode(gt); return 1; } }

  21. Thêm vào CNP:

  22. 3 3 1 2 2 I/ Xóa nút p không là gốc: 1/ p không có con trái hoặc phải: • Gán liên kết từ cha của p xuống con duy nhất của p • 2. Xóa p

  23. 2/ p có con trái và con phải 1. Tìm w là node trước node x trên phép duyệt cây trung thứ tự (chính là node cực phải của cây con bên trái của x) 2. Thay x bằng w 3. Xóa node w cũ (giống trường hợp 1 hoặc 2 đã xét)

  24. II/ Xóa p là nút gốc1/ p không có con trái và phải delete p;T=NULL; p NULL NULL

  25. 2/ T không có con trái hoặc con phải(xóa tương tự như trường hợp I/.1) 3/ T có con trái và con phải(xóa tương tự trường hợp I/.2)

  26. Phần 2: CÂY AVL

  27. Cây cân bằng chiều cao - AVL • ĐN cây AVL: • Là cây NPTK • Tại node bất kỳ, chiều cao nhánh trái và nhánh phải chênh nhau không quá 1. • Ký hiệu cho mỗi node của cây AVL: • Node cân bằng: ‘-’ (bal=0) • Nhánh trái cao hơn: ‘/’ (bal= -1) • Nhánh phải cao hơn: ‘\’ (bal= 1)

  28. Khai báo cây AVL struct AVLNode { int bal; int Info; AVLNode* pLeft,* pRight; }; typedef AVLNode* AVLTree; AVLNode* T;

  29. Các thao tác: • Nhập xuất cây. • Thêm phần tử X trong cây. • Tìm phần tử X trong cây. • Hủy phần tử X trong cây. • Hủy toàn bộ cây AVL Lưu ý: mỗi thao tác thêm hay xóa,nếu cây bị mất cân bằng,ta phải cân bằng lại cây.

  30. Cây AVL Không phải cây AVL Ví dụ cây AVL

  31. Thêm 1 phần tử trên cây AVL Int insertNode(AVLTree & T, int x) { return -1; // khi khong du bo nho return 0;//khi gap nut cu return 1;//cay can bang return 2://thanh cong, chieu cao tang }

  32. \ / \ – \\ Các trạng thái khi thêm vào Thêm vào bên phải và làm bên phải cao lên Thêm vào bên phải và làm bên phải cao lên Thêm vào bên phải và làm bên phải cao lên Chiều cao cây tăng Chiều cao cây không đổi Mất cân bằng bên phải

  33. Cân bằng cây AVL – Quay đơn

  34. m \\ – k \ t – p \ u v – (1) Ví dụ thêm vào cây AVL

  35. (2) m \\ – k \ t – p \ u v – Ví dụ 2 thêm vào cây AVL (tt.) Viết gọn

  36. void rotateLL(AVLTree &T) { AVLNode* T1=T->pLeft; T->pLeft=T1->pRight; T1->pRight=T; switch(T1->bal) { case LH: T->bal=EH; T1->bal=EH; break; case EH: T->bal=LH; T1->bal=RH; break; } T=T1; }

  37. //Quay kep Left-Right void rotateLR(AVLTree &T) { AVLNode* T1=T->pLeft; AVLNode* T2=T->pRight; T->pLeft=T2->pRight; T2->pRight=T; T1->pRight=T2->pLeft; T2->pLeft=T1; switch(T2->bal){ case LH: T->bal=RH; T1->bal=EH; break; case EH: T->bal=EH; T1->bal=EH; break; case RH: T->bal=EH; T1->bal=LH; break; } T2->bal=EH; T=T2;}

  38. Xóa:Các trạng thái khi xóa node

  39. Các trạng thái khi xóa node (tt.)

  40. Các trạng thái khi xóa node (tt.)

  41. Ví dụ xóa node của cây AVL

  42. Ví dụ xóa node của cây AVL (tt.)

More Related