bài giảng cấu trúc dữ liệu 1

85 41 0
bài giảng cấu trúc dữ liệu 1

Đ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ƯỜ TRƯỜNG ĐẠ ĐẠI HỌ HỌC AN GIANG KHOA KỸ KỸ THUẬ THUẬT- CÔNG NGHỆ NGHỆ - MÔI TRƯỜ TRƯỜNG CẤU TRÚC DỮ LIỆU GiỚI THIỆU ‹Chương 1: Tổng quan giải thuật cấu trúc liệu ‹Chương 2: Tìm kiếm xếp ‹Chương 3: Cấu trúc liệu động ‹Chương 4: Cấu trúc Giảng viên phụ trách: NGUYỄN THÁI DƯ Bộ môn Tin học email: ntdu@agu.edu.vn 1 Nguyễn Thái Dư - AGU MỤC TIÊU Phương pháp học tập ‹Cần biết: ƒ Ngôn ngữ: C, Java ‹Mục tiêu: ƒ Có hiểu biết tốt CTDL GT ƒ Hiểu cài đặt kiểu liệu trừu tượng ƒ Nắm giải thuật xếp tìm kiếm ƒ Nắm số phương pháp thiết kế giải thuật ƒ Rèn luyện cách phân tích tốn, Tìm giải thuật ƒ Thể cách phân tích qua NNLT cụ thể (C, Java) Nguyễn Thái Dư - AGU Nguyễn Thái Dư - AGU ‹GV: Trình bày ngắn gọn ‹SV: Đọc tài liệu có liên quan tự giác làm tập tài liệu sách tham khảo ‹GV-SV: Giải đáp thắc mắc - Trao đổi Nguyễn Thái Dư - AGU Phân bố tiết môn học Tài liệu tham khảo ‹ Nhập môn Cấu trúc liệu thuật tốn – Hồng Kiếm (chủ biên), Trần Hạnh Nhi, Dương Anh Đức, 2003 ‹ Cấu trúc liệu giải thuật, Đỗ Xuân Lôi, , NXB Khoa học Kỹ thuật, 1995 ‹ Cấu trúc liệu, Nguyễn Văn Linh (chủ biên), ĐH Cần thơ, 2003 ‹ Giải thuật, Nguyễn Văn Linh (chủ biên), ĐH Cần thơ, 2003 ‹ Data Structures and Algorithm Analysis in C, Mark Allen Weiss, 1992 ‹ Algorithms In C, Sedgewick, 1990 ‹ Tổng cộng: 60 tiết ƒ Lý thuyết: 30 tiết ƒ Thực hành: 30 tiết Nguyễn Thái Dư - AGU Nguyễn Thái Dư - AGU Tài liệu tham khảo ‹ Introduction to Algorithms 2nd, Thomas H Cormen, 2001 ‹ Sedgewick Robert, Cẩm nang thuật toán, tập 2, dịch Hoàng Hồng, NXB Khoa học Kỹ thuật, 2001 ‹ Wirth Niklaus, Cấu trúc liệu + Giải thuật = Chương trình, dịch Nguyễn Quốc Cường, Nhà xuất Giáo dục, 1993 Nguyễn Thái Dư - AGU Thắc mắc Nguyễn Thái Dư - AGU TRƯỜ TRƯỜNG ĐẠ ĐẠI HỌ HỌC AN GIANG KHOA KỸ KỸ THUẬ THUẬT- CÔNG NGHỆ NGHỆ - MÔI TRƯỜ TRƯỜNG CẤU TRÚC DỮ LIỆU Chương TỔNG QUAN CẤU TRÚC DỮ LIỆU ‹Cấu trúc liệu (Data Structures) ‹Kiểu liệu trừu tượng (Abstract Data Type - ADT) ‹Giải thuật (Algorithms) ‹Tính tóan độ phức tạp giải thuật (Computational complexity of algrorithms) ‹Phân tích giải thuật (Algorithm Analysis) Giảng viên phụ trách: NGUYỄN THÁI DƯ Bộ môn Tin học email: ntdu@agu.edu.vn Nguyễn Thái Dư - AGU 1 Nguyễn Thái Dư - AGU Cấu trúc liệu (Data Structures) Kiểu liệu trừu tượng (ADT) ‹Cấu trúc liệu dùng để tổ chức liệu ƒ Thường có nhiều thành phần ƒ Có thao tác hợp lý liệu ƒ Dữ liệu kết nối với (ví dụ: array) tập hợp ‹Một kiểu liệu trừu tượng (Abstract Data Type - ADT) tập hợp đối tượng xác định hoàn toàn phép tốn biểu diễn đối tượng ‹ADT mơ hình tốn cấu trúc liệu xác định kiểu liệu lưu trữ, thao tác hỗ trợ liệu kiểu tham số thao tác Nguyễn Thái Dư - AGU Nguyễn Thái Dư - AGU Kiểu liệu trừu tượng (ADT) Kiểu liệu trừu tượng (ADT) ‹Có hai loại ADT ƒ Đơn/nguyên tử: int, char, … ƒ Có cấu trúc: array, struct,… ‹Ngồi ADT ngơn ngữ lập trình cung cấp, người lập trình có tạo ADT riêng ‹Trong C, ADT người dùng định nghĩa thông qua kiểu cấu trúc (struct), thao tác xây dựng hàm (functions) Nguyễn Thái Dư - AGU Nguyễn Thái Dư - AGU Tại cần phải học Cấu trúc liệu Giải thuật? Kiểu liệu trừu tượng (ADT) ‹Person ƒ Cấu thành bởi: – Họ tên – Ngày sinh – Nơi sinh – Phái ƒ Phép toán: – Tạo person (với thông tin đầy đủ) – Hiển thị thông tin person – … Nguyễn Thái Dư - AGU ‹Các lớp thao tác ADT ƒ Tạo lập đối tượng ƒ Biến đổi đối tượng ADT – Mang lại thay đổi cần thiết cho đối tượng ƒ Quan sát – Cho biết trạng thái đối tượng ƒ Chuyển đổi kiểu – Chuyển kiểu từ kiểu sang kiểu khác ƒ Vào liệu – Nhập/xuất giá trị cho đối tượng ‹Giải thuật? ƒ Tại lại cần phải học giải thuật? Vai trò giải thuật? Những vấn đề cần giải giải thuật? ‹Giải thuật: ƒ Là khái niệm quan trọng tin học Thuật ngữ xuất phát từ nhà tóa học Ảrập Abu Ja’far Mohammed ibn Musa al Khowarizmi (khỏang năm 825) ƒ Thuật tóan tiếng nhất, có từ thời kỳcổ Hy Lạp thuật tóan Euclid ƒ Là phương pháp giải vấn đề thích hợp để cài đặt chương trình máy tính Nguyễn Thái Dư - AGU Tại cần phải học Cấu trúc liệu Giải thuật? Tại cần phải học Cấu trúc liệu Giải thuật? ‹Algorithm: ƒ A finite sequence of steps for solving a logical or mathematical problem or performing a task (The Microsoft Computer Dictionary, Fifth Edition ) ƒ A computable set of steps to achieve a desired result ƒ Informally, an algorithm is any well-defined computational procedure that takes some value, or set of values, as input and produces some value, or set of values, as output An algorithm is thus a sequence of computational steps that transform the input into the output (Introduction to Algorithms, 2nd, Thomas H Cormen, 2001) Nguyễn Thái Dư - AGU Cấu trúc liệu + Giải thuật = Chương trình Nguyễn Thái Dư - AGU 10 Tại cần phải học Cấu trúc liệu Giải thuật? Kiểu liệu ‹ĐN kiểu liệu ‹Các thuộc tính kiểu liệu ƒ Tên kiểu liệu ƒ Miền giá trí ƒ Kích thước lưu trữ ƒ Tập tóan tử, phép tóan tác động kiểu liệu ‹Một số kiểu liệu có cấu trúc ƒ Kiểu chuỗi ký tự (string), Kiểu mảng (array) ƒ Kiểu mẩu tin (struct) ƒ Kiểu tập hợp (union) Nguyễn Thái Dư - AGU ‹Cấu trúc liệu? ƒ Được tạo để phục vụ cho giải thuật ƒ Phải hiểu cấu trúc liệu để hiểu giải thuật ⇒ để giải vấn đề ƒ Các giải thuật đơn giản cần đến cấu trúc liệu phức tạp ƒ Các giải thuật phức tạp dùng cấu trúc liệu đơn giản 11 ‹Dùng máy tính để: ƒ Giải vấn đề tính tốn? ƒ Việc giải vấn đề nhanh hơn? ƒ Khả truy xuất nhiều liệu hơn? ‹Kỹ thuật vs Thực thi/Giá ƒ Kỹ thuật tăng khả giải vấn đề nhân tố ƒ Thiết kế giải thuật tốt giúp giải vấn đề tốt nhiều rẻ ƒ Một siêu máy tính giúp giải thuật tồi làm việc tốt Nguyễn Thái Dư - AGU 12 Một số tính chất chung thuật tóan Ví dụ ‹ Đầu vào (input): có giá trị đầu vào xác định ‹ Đầu (ouput): từ tập giá trị đầu vào, thuât toán tạo giá trị đầu ra, xem nghiệm tốn ‹ Tính xác định (definiteness): bước thuật toán phải xác định cách xác ‹ Tính hữu hạn (finiteness): thuật tốn chứa số hữu hạn bước (có thể lớn) với tập đầu vào ‹ Tính hiệu quả(effectiveness): bước phải thực xác, khoảng thời gian hữu hạn ‹ Tính tổng quát(general): thuật toán phải áp dụng cho họ vấn đề Nguyễn Thái Dư - AGU 13 Ví dụ so sánh - Tìm tuyến tính tìm nhị phân Nguyễn Thái Dư - AGU 14 Ví dụ so sánh - Tìm tuyến tính tìm nhị phân // Tìm nhị phân int binarySearch(int a[], int x, int n) { int left = 0, right = N - 1, middle; { middle = (left + right) / 2; if (a[middle] == x) return TRUE; else if (x < a[middle]) right = middle – 1; else left = middle + 1; } while (left Front=(Q->Front+1) % Maxlength; //tăng Front lên đơn vị } else printf("Loi: Hang rong!"); } Nguyễn Thái Dư - AGU 34 Cài đặt hàng với mảng xoay vòng ‹Thêm phần tử vào hàng ƒ Khi thêm phần tử vào hàng xảy trường hợp sau: - Trường hợp hàng đầy báo lỗi khơng thêm; - Ngược lại, thay đổi giá trị Q.rear • Nếu Q.rear =maxlength-1 đặt lại Q.rear=0; • Ngược lại Q.rear =Q.rear+1 đặt nội dung vào vị trí Q.rear Nguyễn Thái Dư - AGU void DeQueue(Queue *Q) { if (!IsEmpty_Queue(*Q)) { 35 void EnQueue(ElementType X,Queue *Q) { if (!IsFull_Queue(*Q)) { if (IsEmpty_Queue(*Q)) Q->Front=0; Q->Rear=(Q->Rear+1) % MaxLength; Q->Elements[Q->Rear]=X; } else printf("Loi: Hang day!"); } Nguyễn Thái Dư - AGU 36 Cài đặt hàng trỏ Cài đặt hàng trỏ (tt) ‹Khai báo typedef int ElementType; struct Node { ElementType Element; Node *Next; }; typedef struct Node *PtrToNode; typedef PtrToNode Queue; typedef PtrToNode Position; ‹Các hàm void Makenull_Queue( Queue &Q ); int IsEmpty_Queue( Queue Q ); void EnQueue( ElementType X, Queue Q ); void DeQueue( Queue Q ); ElementType Front(Queue Q); Position Header( Queue Q ); 37 Nguyễn Thái Dư - AGU Cài đặt hàng trỏ (tt) Cài đặt hàng trỏ (tt) ‹Chèn phần tử X vào cuối hàng void EnQueue( ElementType X, Queue Q ) { Position TmpCell, P; P = Header(Q); while(P->Next != NULL) //Tim vi tri cuoi hang doi P=P->Next; ‹Tạo hàng rỗng void Makenull_Queue( Queue &Q ) { Q = new Node; Q->Next = NULL; } TmpCell = new Node; if( TmpCell == NULL ) printf( "Out of space!!!" ); TmpCell->Element = X; TmpCell->Next = P->Next; P->Next = TmpCell; ‹Kiểm tra hàng rỗng int IsEmpty_Queue( Queue Q ) { return Q->Next == NULL; } Nguyễn Thái Dư - AGU 38 Nguyễn Thái Dư - AGU } 39 Nguyễn Thái Dư - AGU 40 Cài đặt hàng trỏ (tt) Cài đặt hàng trỏ (tt) ‹Xóa phần tử đầu hàng void DeQueue(Queue Q ) { Position P, TmpCell; P = Header(Q); if( P->Next!=NULL ) { TmpCell = P->Next; P->Next = TmpCell->Next; free( TmpCell ); } } Nguyễn Thái Dư - AGU ‹Trả vị trí phần tử Header Position Header( Queue Q ) { return Q; } ‹Trả giá trị phần tử đầu hàng ElementType Front( Queue Q ) { return Q->Next->Element; } 41 Cài đặt hàng danh sách liên kết Cài đặt hàng danh sách liên kết (con trỏ) ‹Cách tự nhiên dùng hai trỏ front rear để trỏ tới phần tử đầu cuối hàng Hàng cài đặt danh sách liên kết có Header thực sự, ‹Khi hàng rỗng Front va Rear trỏ vị trí header Nguyễn Thái Dư - AGU 42 Nguyễn Thái Dư - AGU 43 ‹Khai báo cần thiết typedef int ElementType; struct Node { ElementType Element; Node *Next; }; typedef struct Node *PtrToNode; typedef PtrToNode Position; Nguyễn Thái Dư - AGU struct QueueList { Node *Front; Node *Rear; }; typedef QueueList Queue; 44 Cài đặt hàng danh sách liên kết (con trỏ) ‹Khởi tạo hàng rỗng void Makenull_Queue(Queue &Q) { Q.Front=Q.Rear=NULL; } Nguyễn Thái Dư - AGU Cài đặt hàng danh sách liên kết (con trỏ) ‹Kiểm tra hàng rỗng ƒ Hàng rỗng Front Rear vị trí ô Header Header đến NULL ElementType IsEmpty_Queue(Queue Q) { return(Q.Front==NULL); } 45 Cài đặt hàng danh sách liên kết (con trỏ) Nguyễn Thái Dư - AGU 46 Cài đặt hàng danh sách liên kết (con trỏ) ‹Thêm phần tử vào hàng ƒ Thêm phần tử vào hàng ta thêm vào sau Rear (Rear->next ), cho Rear trỏ đến phần tử Trường next ô trỏ tới NULL Nguyễn Thái Dư - AGU 47 Nguyễn Thái Dư - AGU 48 Cài đặt hàng danh sách liên kết (con trỏ) void EnQueue(Queue &Q,ElementType X) { Position p; p = new Node; if(p==NULL) exit(1); p->Element=X; p->Next=NULL; if(IsEmpty_Queue(Q)) { Q.Front=Q.Rear=p; } else { Q.Rear->Next=p; Q.Rear=p; } } Nguyễn Thái Dư - AGU ‹Xóa phần tử khỏi hàng ƒ Thực chất xố phần tử nằm vị trí đầu hàng ta cần cho front trỏ tới vị trí hàng 49 Cài đặt hàng danh sách liên kết (con trỏ) ElementType DeQueue(Queue &Q) { ElementType X; Position p=Q.Front; if(IsEmpty_Queue(Q)) return -1; X=p->Element; Q.Front=p->Next; free(p); return X; } Nguyễn Thái Dư - AGU Cài đặt hàng danh sách liên kết (con trỏ) 51 Nguyễn Thái Dư - AGU 50 TRƯỜ TRƯỜNG ĐẠ ĐẠI HỌ HỌC AN GIANG KHOA KỸ KỸ THUẬ THUẬT- CÔNG NGHỆ NGHỆ - MÔI TRƯỜ TRƯỜNG CẤU TRÚC DỮ LIỆU CÂY VÀ CÂY NHỊ PHÂN ‹Định nghĩa: Cây tập hợp T phần tử (gọi nút cây) có nút đặc biệt gọi gốc, nút lại chia thành tập rời T1, T2 , , Tn theo quan hệ phân cấp Ti Mỗi nút cấp i quản lý số nút cấp i+1 Quan hệ người ta gọi quan hệ cha-con Giảng viên phụ trách: NGUYỄN THÁI DƯ Bộ môn Tin học email: ntdu@agu.edu.vn Nguyễn Thái Dư - AGU 1 CÁC THUẬT NGỮ CƠ BẢN TRÊN CÂY CÁC THUẬT NGỮ CƠ BẢN TRÊN CÂY ‹Mối quan hệ cha - (parenthood): để xác định hệ thống cấu trúc nút ‹Mỗi nút, trừ nút gốc, có nút cha Một nút có nhiều nút khơng có nút ‹Mỗi nút biểu diễn phần tử tập hợp xét ‹Mối quan hệ cha biểu diễn theo qui ước nút cha dòng nút dòng nối đoạn thẳng Nguyễn Thái Dư - AGU Nguyễn Thái Dư - AGU ‹Bậc nút: Là số nút ‹Bậc cây: Là bậc lớn nút (số tối đa nút thuộc cây) Cây có bậc n gọi n-phân ‹Nút gốc: Là nút khơng có nút cha ‹Nút lá: Là nút có bậc ‹Nút nhánh: Là nút có bậc khác khơng phải gốc ‹Mỗi nút, trừ nút gốc, có nút cha Một nút có nhiều nút khơng có nút Nguyễn Thái Dư - AGU CÁC THUẬT NGỮ CƠ BẢN TRÊN CÂY Một số ví dụ đối tượng cấu trúc dạng ‹Mức nút: ƒ Mức (gốc (T) ) = ƒ Gọi T1, T2, T3, , Tn T0 ƒ Mức (T1) = Mức (T2) = = Mức (Tn) = Mức (T0) + ‹Độ dài đường từ gốc đến nút x: Là số nhánh cần qua kể từ gốc đến x ‹Độ dài đường trung bình: PI = PT/n (n số nút T) ‹Rừng cây: Là tập hợp nhiều thứ tự quan trọng Nguyễn Thái Dư - AGU Sơ đồ tổ chức công ty Nguyễn Thái Dư - AGU CÂY NHỊ PHÂN (BINARY TREES) CÂY NHỊ PHÂN (BINARY TREES) ‹Định nghĩa ƒ Cây nhị phân rỗng mà nút có tối đa hai nút ƒ Các nút phân biệt thứ tự rõ ràng • nút gọi nút trái • nút gọi nút phải • Ta qui ước vẽ nút trái bên trái nút cha nút phải bên phải nút cha, nút nối với nút cha đoạn thẳng Nguyễn Thái Dư - AGU Nguyễn Thái Dư - AGU CÂY NHỊ PHÂN (BINARY TREES) Một số tính chất nhị phân ‹Số nút nằm mức I ≤ 2I ‹Số nút ≤ 2h-1, với h chiều cao ‹Chiều cao h ≥ log2(số nút cây) ‹Số nút ≤ 2h-1 Nguyễn Thái Dư - AGU 10 Nguyễn Thái Dư - AGU Cây nhị phân Cây nhị phân ‹Duyệt nhị phân ƒ Duyệt tiền tự (Node-Left-Right): duyệt nút gốc, duyệt tiền tự trái duyệt tiền tự phải ƒ Duyệt trung tự (Left-Node-Right): duyệt trung tự trái đến nút gốc sau duyệt trung tự phải ƒ Duyệt hậu tự (Left-Right-Node): duyệt hậu tự trái duyệt hậu tự phải sau nút gốc A B C D E F G Node H Left Nguyễn Thái Dư - AGU I J K L M Right 11 Nguyễn Thái Dư - AGU 12 Cài đặt nhị phân Cây nhị phân typedef int ElementType; struct TreeNode; typedef struct TreeNode *Node; typedef struct TreeNode *Tree; //Khai bao cay nhi phan struct TreeNode { ElementType Element; Node Left; //Con tro Trai Node Right; //Con tro Phai }; A B C D H E I F J K G L M Tiền tự Các danh sách duyệt nhị phân ABDHIEJCFKLGM Trung tự HDIBJEAKFLCGM Hậu tự HIDJEBKLFMGCA 13 Nguyễn Thái Dư - AGU Cài đặt nhị phân Cài đặt nhị phân ‹ Tạo rỗng : Cây rỗng không chứa nút Tree MakeEmpty(Tree T) { if(T!=NULL) { MakeEmpty(T->Left); MakeEmpty(T->Right); free(T); } return NULL; } Nguyễn Thái Dư - AGU 14 Nguyễn Thái Dư - AGU 15 ‹ Kiểm tra rỗng int IsEmpty_Tree(Tree T) { return (T==NULL); } Nguyễn Thái Dư - AGU 16 Cài đặt nhị phân Cài đặt nhị phân ‹Xác định trái nút Node LeftChild(Tree p) { if (p!=NULL) return p->Left; else return NULL; } ‹Xác định phải nút Node RightChild(Tree p) { if (p!=NULL) return p->Right; else return NULL; } ‹Kiểm tra nút lá: ƒ Nếu nút nút khơng có nên trái phải nil int IsLeaf(Tree p) { if(p!=NULL) return(LeftChild(p)==NULL) &&(RightChild(p)==NULL); else return 0; } 17 Nguyễn Thái Dư - AGU Cài đặt nhị phân Cài đặt nhị phân ‹Xác định số nút int nb_nodes(Tree T) { if(IsEmpty_Tree(T)) return 0; else return + nb_nodes(LeftChild(T)) + nb_nodes(RightChild(T)); } Nguyễn Thái Dư - AGU 18 Nguyễn Thái Dư - AGU ‹Thủ tục duyệt tiền tự void PreOrder(Tree T) { printf("\t%d",T->Element); if (LeftChild(T)!=NULL) PreOrder(LeftChild(T)); if (RightChild(T)!=NULL) PreOrder(RightChild(T)); } 19 Nguyễn Thái Dư - AGU 20 Cài đặt nhị phân Cài đặt nhị phân ‹Thủ tục duyệt trung tự void InOrder(Tree T) { if (LeftChild(T)!=NULL) InOrder(LeftChild(T)); printf("\t%d",T->Element); if (RightChild(T)!=NULL) InOrder(RightChild(T)); } ‹Thủ tục duyệt hậu tự void PosOrder(TTree T) { if (LeftChild(T)!=NULL) PosOrder(LeftChild(T)); if (RightChild(T)!=NULL) PosOrder(RightChild(T)); printf("\t%d ",T->Element); } 21 Nguyễn Thái Dư - AGU 22 Nguyễn Thái Dư - AGU CÂY TÌM KIẾM NHỊ PHÂN (BINARY SEARCH TREES) Binary Search Trees - BST ‹Định nghĩa ƒ Cây tìm kiếm nhị phân (TKNP) nhị phân mà khoá nút lớn khoá tất nút thuộc bên trái nhỏ khoá tất nút thuộc bên phải ‹Lưu ý: khố nút tính dựa trường đó, ta gọi trường khố Trường khố phải chứa giá trị so sánh được, tức phải lấy giá trị từ tập hợp có thứ tự 20 10 35 17 15 22 42 30 TKNP có khố số ngun (với quan hệ thứ tự tập số nguyên) Nguyễn Thái Dư - AGU 23 Nguyễn Thái Dư - AGU 24 Binary Search Trees - BST BST – Cài đặt ‹Qui ước: Cũng tất cấu trúc khác, ta coi rỗng TKNP ‹Nhận xét: ƒ Trên TKNP khơng có hai nút khố ƒ Cây TKNP TKNP ƒ Khi duyệt trung tự (InOrder) TKNP ta dãy có thứ tự tăng Chẳng hạn duyệt trung tự ta có dãy: 5, 10, 15, 17, 20, 22, 30, 35, 42 ‹Có thể áp dụng cách cài đặt trình bày phần nhị phân ‹Một cách cài đặt TKNP thường gặp cài đặt trỏ Mỗi nút mẩu tin (struct) có ba trường: ƒ Khố (Key) ƒ Nút trái (Left) ƒ Nút phải (Right) (nếu nút vắng mặt ta gán trỏ NULL) 25 Nguyễn Thái Dư - AGU Cài đặt nhị phân BST – Cài đặt typedef … ElementType; struct TreeNode; typedef struct TreeNode *Node; typedef struct TreeNode *Tree; //Khai bao cay nhi phan struct TreeNode { ElementType Element; Node Left; //Con tro Trai Node Right; //Con tro Phai }; Nguyễn Thái Dư - AGU 26 Nguyễn Thái Dư - AGU 27 ‹Tìm kiếm nút có khóa cho trước TKNP Để tìm kiếm nút có khố x TKNP, ta tiến hành từ nút gốc cách so sánh khoá nút gốc với khoá x ƒ Nếu nút gốc NULL khơng có khố x ƒ Nếu x khoá nút gốc giải thuật dừng ta tìm nút chứa khoá x ƒ Nếu x lớn khoá nút gốc ta tiến hành (một cách đệ qui) việc tìm khố x bên phải ƒ Nếu x nhỏ khố nút gốc ta tiến hành 28 (một cách đệ qui) việc tìm khố x bên trái Nguyễn Thái Dư - AGU BST – Cài đặt BST – Cài đặt ‹Ví dụ: tìm nút có khố 30 trong hình sau 20 10 17 15 Nguyễn Thái Dư - AGU 35 22 42 30 29 BST–Thêm nút có khóa cho trước vào TKNP ‹Thêm nút có khóa cho trước vào TKNP Ta tiến hành từ nút gốc cách so sánh khóa nút gốc với khoá x ƒ Nếu nút gốc NULL khố x chưa có cây, ta thêm nút chứa khoá x ƒ Nếu x khố nút gốc giải thuật dừng, trường hợp ta không thêm nút ƒ Nếu x lớn khố nút gốc ta tiến hành (một cách đệ qui) giải thuật bên phải ƒ Nếu x nhỏ khoá nút gốc ta tiến hành (một cách đệ qui) giải thuật bên trái Nguyễn Thái Dư - AGU 31 ‹Hàm trả kết trỏ trỏ tới nút chứa khoá x NULL khơng tìm thấy khố x Node Search(ElementType X, Tree T) { if(T == NULL) return NULL; if(X < T->Element) return Search( X, T->Left); else if(X > T->Element) return Search(X, T->Right); else return T; } 30 Nguyễn Thái Dư - AGU BST–Thêm nút có khóa cho trước vào TKNP Thêm khoá 19 vào 20 10 35 17 15 Nguyễn Thái Dư - AGU 22 19 42 30 32 BST–Thêm nút có khóa cho trước vào TKNP Tree Insert(ElementType X,Tree T) { if(T==NULL) { T= (TreeNode*) malloc(sizeof(struct TreeNode) ); if(T==NULL) printf("Out of space!");//Loi else { T->Element = X; T->Left = T->Right = NULL; } } else if(X < T->Element) T->Left = Insert(X, T->Left); else if(X > T->Element) T->Right = Insert(X,T->Right); return T; } 33 Nguyễn Thái Dư - AGU BST–Xóa nút có khóa cho trước khỏi TKNP ‹Xóa nút 15 có nút 15 10 10 18 16 Nguyễn Thái Dư - AGU ‹Xóa nút có khóa cho trước khỏi TKNP 15 10 15 18 10 NULL Xóa nút có khóa 18 15 15 10 18 16 Nguyễn Thái Dư - AGU 10 16 Xóa nút có khóa 18, có nút 34 BST–Xóa nút có khóa cho trước khỏi TKNP ‹Giải thuật xóa nút có khóa cho trước ‹Nếu khơng tìm thấy nút chứa khố x giải thuật kết thúc ‹Nếu tìm gặp nút N có chứa khố x, ta có ba trường hợp sau ƒ Nếu N ta thay NULL ƒ N có nút ta thay nút ƒ N có hai nút thay nút lớn trái (nút cực phải trái) nút bé phải (nút cực trái phải) 16 18 BST–Xóa nút có khóa cho trước khỏi TKNP 35 Nguyễn Thái Dư - AGU 36 BST–Xóa nút có khóa cho trước khỏi TKNP ‹Trong giải thuật sau, ta thay x khoá nút cực trái bên phải ta xoá nút cực trái ‹Hàm sau trả khoá nút cực trái, đồng thời xoá nút Node FindMin(Tree T) { if(T==NULL) return NULL; else if(T->Left == NULL) return T; else return FindMin(T->Left); } Nguyễn Thái Dư - AGU 37 BST–Xóa nút có khóa cho trước khỏi TKNP else //Nut co if(T->Left!=NULL && T->Right!=NULL) { TmpCell = FindMin(T->Right); T->Element = TmpCell->Element; T->Right = Delete(T->Element, T->Right); } else { TmpCell = T; if (T->Left == NULL) T = T->Right; else if (T->Right == NULL) T = T->Left ; free(TmpCell); //Xoa nut } return T; } Nguyễn Thái Dư - AGU 39 BST–Xóa nút có khóa cho trước khỏi TKNP Tree Delete(ElementType X,Tree T) { Node TmpCell; if(T== NULL) printf("Element not found"); else if (X < T->Element) T->Left = Delete(X, T->Left); else if(X > T->Element) T-> Right = Delete(X, T->Right); //else Nguyễn Thái Dư - AGU 38 ... ns 10 48 μs 60 61 1 .1 × 10 9 61 ns 1s 80 81 1 .1 × 10 12 81 ns 18 10 0 10 1 1. 1 × 10 15 10 1 ns 13 days 12 0 12 1 1. 2 × 10 18 12 1 ns 36 years 16 0 16 1 1. 2 × 10 24 16 1 ns 3.8 × 10 7 years 200 2 01 1.3 × 10 30... trị 7: 10 11 12 13 14 15 a 10 13 13 15 19 19 23 28 28 32 32 37 41 46 (0 +15 )/2=7; a[7] =19 ; tìm 15 10 11 12 13 14 15 (0 +15 )/2=7; a[7] =19 ; tìm (8 +15 )/2 =11 ; a [11 ]=32; tìm 12 15 (0+6)/2=3; a[3] =13 ; tìm... tìm (12 +15 )/2 =13 ; a [13 ]=37; tím 12 12 (12 +12 )/2 =12 ; a [12 ]=32; tìm 13 12 13 >12 , => 36 không thấy Nguyễn Thái Dư - AGU a 10 13 13 15 19 19 23 28 28 32 32 37 41 46 (0+2)/2 =1; a [1] =7; Kết thúc 15 Nguyễn

Ngày đăng: 16/05/2019, 18:10

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

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

Tài liệu liên quan