Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
163,39 KB
Nội dung
22 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 43 Câynhịphântìmkiếm(BST –Binary SearchTree) ! Ý nghĩa của cây BST ! Định nghĩa ! Ví dụ ! Mô tả cấu trúc dữ liệu ! Xây dựng các thao tác cơ bản trên cây ! Các đánh giá ! Trắc nghiệm Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 44 Câynhịphântìmkiếm Ý nghĩa của cây BST ! Điểm yếu và điểm mạnh của việc sử dụng mảng ? ! Điểm yếu và điểm mạnh của việc sử dụng danh sách liên kết ? ! Cần có 1 cấu trúc tổng hợp được điểm mạnh của cả mảng và danh sách liên kết. ! Trong câynhị phân, chi phí để tìmkiếm 1 phần tử ? 23 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 45 Câynhịphântìmkiếm Định nghĩa ! Câynhịphântìmkiếm là: ! Một câynhịphân ! Mỗi nút p của cây đều thỏa: ! Tất cả các nút thuộc cây con trái (p->pLeft) đều có giá trị nhỏ hơn giá trị của p ∀q ∈ p->pLeft: q->Data < p->Data ! Tất cả các nút thuộc cây con phải (p->pRight) đều có giá trị lớn hơn giá trị của p ∀q ∈ p->pRight: q->Data > p->Data Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 46 Câynhịphântìmkiếm Vídụ 24 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 47 Câynhịphântìmkiếm Vídụ Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 48 Câynhịphântìmkiếm Môtảcấu trúc dữ liệu ! Cách lưu trữ cây BST giống như câynhịphân ! Xem lại phần “Tổng quan về câynhịphân -Cách thức lưu trữ cây” 25 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 49 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Các thao tác trên cây BST: ! Tạo lập cây rỗng ! Kiểm tra cây rỗng ! Tìmkiếm 1 phần tử ! Thêm 1 phần tử ! Xóa 1 phần tử Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 50 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Tạo lập cây rỗng: void BSTCreate(BIN_TREE &t) { t.Count = 0; // Số nút trong cây t.pRoot = NULL; // Con trỏ đến nút gốc } 26 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 51 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Kiểm tra cây rỗng: int BSTIsEmpty(const BIN_TREE &t) { if (t.pRoot==NULL) return 1; return 0; } Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 52 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Ví dụ tìmkiếmphần tử 25: 40 65 32 24 36 30 254 70 75 pRoot 25 27 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 53 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Ví dụ tìmkiếmphần tử “Nancy”: Jane TomBob Alan Ellen WendyNancyNancy Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 54 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Ví dụ tìmkiếmphần tử 31: 40 65 32 24 36 30 254 70 75 pRoot NULL, không tìm thấy 28 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 55 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Tìmkiếm 1 phần tử: BT_NODE *BSTSearch(const BT_NODE *pCurr, int Key) { if (pCurr==NULL) return NULL; // Không tìm thấy if (pCurr->Data==Key) return pCurr; // Tìm thấy else if (pCurr->Data > Key) // Tìm trong cây con trái return BSTSearch(pCurr->pLeft, Key); else // Tìm trong cây con phải return BSTSearch(pCurr->pRight, Key); } Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 56 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Ví dụ thêm phần tử “Frank”: Jane TomBob Alan Ellen WendyNancy NULL, kết thúc tìmkiếm ở đây 29 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 57 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây Jane TomBob Alan Ellen WendyNancy Frank ! Ví dụ thêm phần tử “Frank”: Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 58 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây 40 65 32 24 36 30 274 70 75 pRoot ! Ví dụ thêm phần tử 26: NULL, kết thúc tìmkiếm ở đây 30 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 59 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây 40 65 32 24 36 30 274 70 75 pRoot 26 ! Ví dụ thêm phần tử 26: Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 60 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây 40 65 32 24 36 30 274 70 75 pRoot ! Ví dụ thêm phần tử 27: 27 Tìm thấy, không thêm nữa 31 Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 61 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Thêm 1 phần tử: int BSTInsert(BT_NODE *&pCurr, int newKey) { if (pCurr==NULL) { pCurr = new BT_NODE;// Tạo 1 nút mới pCurr->Data = newKey; pCurr->pLeft = pCurr->pRight = NULL; return 1;// Thêm thành công } if (pCurr->Data > newKey)// Thêm vào cây con trái return BSTInsert(pCurr->pLeft, newKey); else if (pCurr->Data < newKey)// Thêm vào cây con phải return BSTInsert(pCurr->pRight, newKey); else return 0;// Trùng khóa, không thêm nữa } Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 62 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Thao tác xóa 1 phần tử: ! Áp dụng giải thuật tìmkiếm để xác định nút chứa phần tử cần xóa ! Nếu tìm thấy, xóa phần tử đó khỏi cây ! Các trường hợp xảy ra: ! Xóa 1 nút không có nút con ! Xóa 1 nút có 1 nút con ! Xóa 1 nút có 2 nút con [...]... Tuan - Khoa CNTT ĐH KHTN Tp.HCM 68 34 Cây nhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Xóa phần tử 40 (có 2 nút con): Cách 1: thay thế bằng phần tử lớn nhất trong cây con bên trái 36 40 65 32 24 4 75 36 25 70 30 Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 69 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Xóa phần tử 40 (có 2 nút con):... Tuan - Khoa CNTT ĐH KHTN Tp.HCM 64 32 Cây nhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Xoá 1 nút chỉ có nút con phải: P P pCurr L L Trước khi xóa pCurr Sau khi xóa pCurr P->pLeft = pCurr->pRight; delete pCurr; Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Spring 2004 65 Cây nhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Ví dụ xóa phần tử 75 (chỉ có nút... Tuan - Khoa CNTT ĐH KHTN Tp.HCM 66 33 Cây nhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây Xoá 1 nút chỉ có nút con trái: ! P P pCurr L L Trước khi xóa pCurr Sau khi xóa pCurr P->pRight = pCurr->pLeft; delete pCurr; Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Spring 2004 67 Cây nhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây Ví dụ xóa phần tử 40 (có 2 nút con).. .Cây nhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Ví dụ xóa phần tử 4 (không có nút con) 40 40 65 32 24 4 36 25 65 32 75 24 70 36 25 Gán liên kết ở nút cha thành NULL 30 75 70 30 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM Spring 2004 63 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Ví dụ xóa phần tử 25 (chỉ có... con pTemp = _SearchStandFor(pCurr->pLeft, pCurr); delete pTemp; } Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 73 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Xóa 1 phần tử (tt)…: // Tìmphần tử thay thế: “Phần tử lớn nhất trong cây con bên trái” BT_NODE * _SearchStandFor(BT_NODE *&p, BT_NODE *pCurr) { if (p->pRight != NULL) return _SearchStandFor(p->pRight,... nào độ cao của cây nhỏ nhất ? Lớn nhất ? So sánh giữa cây BST với mảng được sắp thứ tự: ! ! ! ! Spring 2004 Có cùng chi phí tìmkiếm O(log2N) Cây BST có chi phí thêm 1 phần tử O(log2N); mảng có chi phí thêm 1 phần tử O(N) Tương tự đối với thao tác xóa 1 phần tử Cây BST tốn nhiều bộ nhớ lưu trữ hơn Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 75 Câynhịphântìmkiếm Trắc nghiệm... trong cây con bên phải 65 40 65 32 24 4 75 36 25 70 30 Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 70 35 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Xóa 1 phần tử pCurr có 2 nút con: ! ! ! ! ! Thay vì xóa trực tiếp nút pCurr… …ta tìm 1 phần tử thay thế p, …copy nội dung của p sang pCurr, …xóa nút p Phần tử thay thế p: là phần tử lớn nhất trong cây. .. …là phần tử nhỏ nhất trong cây con bên phải à phần tử p có nhiều nhất là 1 nút con ! Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 71 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Xóa 1 phần tử: int BSTDelete(BT_NODE *&pCurr, int Key) { if (pCurr==NULL) return 0; // Không tìm thấy phần tử if (pCurr->Data > Key) // Xóa trên cây con trái return BSTDelete(pCurr->pLeft,... BSTDelete(pCurr->pLeft, Key); else if (pCurr->Data < Key) // Xóa trên cây con phải return BSTDelete(pCurr->pRight, Key); // Tìm thấy nút cần xóa pCurr à Xóa ! _Delete(pCurr); return 1; } Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 72 36 Câynhịphântìmkiếm Xây dựng các thao tác cơ bản trên cây ! Xóa 1 phần tử (tt)…: void _Delete(BT_NODE *&pCurr) { BT_NODE *pTemp... NULL) return _SearchStandFor(p->pRight, pCurr); // Tìm thấy phần tử thay thế… pCurr->Data = p->Data; // Copy dữ liệu của p vào pCurr BT_NODE *pTemp = p; p = p->pLeft; // Lưu lại nhánh con trái return pTemp; // Xóa phần tử thay thế } Spring 2004 Data Structure & Algorithm - Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 74 37 Câynhịphântìmkiếm Các đánh giá ! Cây có N nút sẽ có độ cao trong khoảng từ [log2(N+1)] . Cây nhị phân tìm kiếm Môtảcấu trúc dữ liệu ! Cách lưu trữ cây BST giống như cây nhị phân ! Xem lại phần “Tổng quan về cây nhị phân -Cách thức lưu trữ cây . 45 Cây nhị phân tìm kiếm Định nghĩa ! Cây nhị phân tìm kiếm là: ! Một cây nhị phân ! Mỗi nút p của cây đều thỏa: ! Tất cả các nút thuộc cây con trái (p->pLeft)