Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
135,32 KB
Nội dung
[Type text] TRƯỜNG ĐẠI HỌC HỒNG ĐỨC KHOA: CNTT & TT BÀI TẬP LỚN MÔN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐỀ TÀI: “CÂY NHỊ PHÂN TÌM KIẾM” Giáo viên HD : Trịnh Thị Phú H ọ tên : Đ ỗ Vi ết Vũ Mã S ố Viên : 1561030049 L ớp : K18 -ĐHCNTT Thanh Hóa, tháng 11 năm 2016 [Type text] MỤC LỤC [Type text] Lời mở đầu Cùng với phát triển khoa học kĩ thuật , công nghệ thông tin nói chung môn cấu trúc liệu giải thuật nói riêng ngày ứng dụng rộng rãi nhiều lĩnh vực Với sở liệu khổng lồ, việc đưa phương pháp nhằm giải vấn đề tìm kiếm liệu có hiệu nhanh chóng quan tâm nhà phát triển phần mềm Thông thường liệu biểu diễn dạng danh sách liên kết Việc truy suất liệu chưa đạt hiệu cao Sử dụng cấu trúc liệu giải pháp làm tăng hiệu suất thao tác xử lý Vấn đề đặt : với việc sử dụng cấu trúc dạng cây, cần dùng giải thuật với dạng liệu để đạt hiệu cao Để giải vấn đề ta tìm hiểu số phương pháp duyệt [Type text] I CƠ SỞ LÝ THUYẾT I.1 Cây nhị phân tìm kiếm • Cây (Trees) tập hợp hữu hạn phần tử gọi nút (Node), có nút đặc biệt gọi nút gốc (Root) Trên tập hợp nút có quan hệ phân cấp gọi quan hệ "cha - con" • Cây nhị phân tìm kiếm (binary search tree – BST) nhị phân nút, khóa nút xét lớn nút khóa tất nút thuộc trái nhỏ tất nút khóa thuộc phải • Ví dụ I.2 Một số khái niệm • Một nút đơn độc • Tập hợp rỗng mà ta gọi rỗng • Mức nút : + Nút gốc : Mức + Các nút cách nút gốc i cạnh gọi nút mức i • Nút gốc (Root): Là nút nút cha • Nút (leaf): Là nút nút [Type text] • Chiều cao nút: Là độ dài đường từ nút đến nút xa • Chiều cao cây: Là chiều cao nút gốc • • II Bậc nút: Là số nút nút Bậc cây: Là bậc cao nút MÔ TẢ CÁC THAO TÁC TRÊN CÂY NHỊ PHÂN TÌM KIẾM II.1 Khai báo cài đặt nhị phân Để biểu diễn nhị phân ta chọn phương pháp cấp phát liên kết ứng với nút của, ta dùng biến động lưu trữ thông tin • Thông tin lưu trữ nút • Địa nút gốc trái nhớ • Địa nút gốc phải nhớ • Khai báo tương ứng sau: #include #include typedef int item ; struct NODE { int key; NODE *Left, *Right; [Type text] typedef NODE *TREE; II.2 Hàm khởi tạo rỗng void khoitaorong(TREE &T){ T=NULL; } II.3 Hàm kiểm tra rỗng int ktrarong(TREE T){ if(T==ULL) return 1; else return 0; } II.4 Hàm thêm nút • Hàm cho phép nhập thêm số vào dãy số mà ta nhập xét số để xếp vào vị trí nút • Xảy hai trường hợp: Cây rỗng Cây không rỗng - Nếu X trùng với gốc ta thêm node [Type text] - Nếu X< gốc chưa có bên trái thực thêm vào bên trái - Tương tự X> gốc ta thêm vào bên phải II.5 Hàm xóa nút • Hàm cho phép ta xóa nút tìm kiếm nhị phân • Xảy hai trường hợp Cây rỗng Cây khác rỗng • - X nút - X có trái (phải) - X có đủ hai Xây dựng thêm hàm tìm kiếm - Hàm tìm kiếm có nhiệm vụ xác định vị trí nút cần xóa II.6 Hàm nhập tìm kiếm nhị phân - Cho phép ta nhập n số ta muốn, n số tạo thành n nút nhị phân - Hàm làm thêm nhiệm vụ xếp vị trí đứng nút vừa nhập II.7 Hàm duyệt II.7.1 Duyệt theo thứ tự trước • Hàm có nhiệm vụ: [Type text] - Thăm nút gốc - Thăm nút gốc trái theo thứ tự trước - Thăm nút gốc phải theo thứ tự trước II.7.2 Duyệt theo thứ tự • Hàm có nhiệm vụ: - Thăm nút gốc trái theo thứ tự - Thăm nút gốc - Thăm nút gốc phải theo thứ tự II.7.3 Duyệt theo thứ tự sau • Hàm có nhiệm vụ sau: - Thăm nút gốc trái theo thứ tự sau - Thăm nút gốc phải theo thứ tự sau - Thăm nút gốc II.8 Hàm xác định số nút • Sử dụng hàm để đếm xem có tất nút • Xảy trường hơp: Cây rỗng số nút Cây không rỗng: chiều cao tổng nút bên trái nút bên phải cộng với ( nút gốc) [Type text] II.9 Hàm xác định chiều cao • Hàm sử dụng để tính chiều cao nhị phân tức đếm số tầng tìm kiếm nhị phân • Ta có trường hợp sau: Trường hợp rỗng xuất chiều cao -1 Cây khác rỗng: - Không có bên trái bên phải chiều cao - Có bên trái bên phải chiều cao 1+ bên trái + bên phải - Cây cực trái cực phải chiều cao 1+ bên trái + bên phải II.10 Hàm xác định mức • Hàm sử dụng để xác định mức nút mà nười sử dụng cần xác định, nút nhập từ bàn phím.có sử dụng biếm đếm, lần lại cộng thêm giá trị III CHƯƠNG TRÌNH MINH HỌA III.1 Xây dựng chương trình Đề bài: Cây nhị phân tìm kiếm Viết chương trình cài đặt tìm kiếm nhị phân (nhãn nút nhập từ bàn phím) Yêu cầu chi tiết: Viết phần khai báo để cài đặt tìm kiếm nhị phân [Type text] Viết thủ tục khởi tạo rỗng Viết hàm kiểm tra rỗng Viết thủ tục xen nút vào tìm kiếm nhị phân Viết thủ tục xóa nút tìm kiếm nhị phân Viết thủ tục nhập tìm kiếm nhị phân với nhãn nút nhập vào từ bàn phím Viết thủ tục duyệt cây: Duyệt tiền tự, trung tự, hậu tự Viết hàm xác định số nút Thiết kế hàm xác định chiều cao 10 Viết hàm xác định mức nút BÀI LÀM // phần khai báo #include #include typedef int item ; //kieu item la kieu nguyen struct NODE { int key; //truong key cua du lieu NODE *Left, *Right; //con trai va phai }; int nmax(int a,int b){ return a>=b?a:b; } int d=0; 10 [Type text] typedef NODE *TREE; //cay // khoi tao rong void khoitaorong(TREE &T){ T=NULL; } // ktra rong int ktrarong(TREE T){ if(T==NULL) return 1; else return 0; } // hàm thêm nút int themnut(TREE &T, int x) // chen Node vao cay { if (T != NULL) { if (T->key == x) return -1; if (T->key > x) return themnut(T->Left, x); else if (T->key < x) return themnut(T->Right, x); } T = (NODE *) malloc(sizeof(NODE)); if (T == NULL) return 0; T->key = x; T->Left = T->Right = NULL; return 1; } // hàm nhap void nhap(TREE &T) // nhap cay { 11 [Type text] int x, tl; while (tl) { printf("\n Nhap vao Node: "); scanf("%d", &x); int check = themnut(T, x); if (check == -1) printf("\n\n Node da ton tai!"); else if (check == 0) printf("\n Khong du bo nho"); printf("\n Ban co muon tiep tuc khong "); scanf("%d",&tl); } } // Duyet theo TTT void ttt(TREE T) { if(T!= NULL) { printf("%d ",T->key); ttt(T->Left); ttt(T->Right); } } // duyet theo tt giua void ttg(TREE T) { if(T!=NULL) { ttg(T->Left); printf("%d ", T->key); ttg(T->Right); 12 [Type text] } } // duyet theo tt sau void tts(TREE T) { if(T!=NULL) { tts(T->Left); tts(T->Right); printf("%d ", T->key); } } // hàm tìm nút NODE* timnut(TREE T, int x) { if (T!=NULL) { if (T->key == x) { NODE *P = T; return P;} if (T->key > x) return timnut(T->Left, x); if (T->key < x) return timnut(T->Right, x); } return NULL; } // dem nut int demnut(TREE T){ if(T==NULL) return 0; else return (demnut(T->Right) + demnut(T->Left) + 1); 13 [Type text] } // hàm xóa nút int xoanut(TREE &T, int x) // xoa nut co key x { if (T==NULL) return 0; if (T->key > x) return xoanut(T->Left, x); if (T->key < x) return xoanut(T->Right, x); else // T->key == x { TREE p = T; if (T->Left == NULL) T = T->Right; // Node chi co cay phai else if (T->Right == NULL) T = T->Left; // Node chi co cay trai else // Node co ca { NODE* q = T->Right; timnut(T, x); } delete p; } } //xac dinh chieu cao cua cay int ccaocay(TREE T){ if(T==NULL)return -1; else if((T->Right==NULL) && (T->Left==NULL)) return 0; else 14 [Type text] if((T->Right!=NULL) && (T->Left!=NULL)) return nmax((1 + ccaocay(T->Right)),(1 + ccaocay(T->Left))); else if(T->Left==NULL&&T->Right!=NULL) return (1 + ccaocay(T->Right)); else if(T->Left!=NULL&&T->Right==NULL) return (1 + ccaocay(T->Left)); } // hàm xác định mức nút void muc(TREE T, int x) { if (T!=NULL) { d++; if (T->key > x) muc(T->Left, x); if (T->key < x) muc(T->Right, x); } } // hàm main int main() { TREE T; T=NULL; //Tao cay rong nhap(T); //Nhap cay //duyet cay printf("\n Duyet cay theo ttt: "); ttt(T); 15 [Type text] printf("\n Duyet cay theo ttg: "); ttg(T); printf("\n Duyet cay theo tts: "); tts(T); printf("\n so nut cua cay la:%d", demnut(T)); printf("\n Chieu cao cay la: %d",ccaocay(T)); int a; printf("\n Nhap nut: "); scanf("%d",&a); d=0; muc(T,a); printf(" Muc cua nut la: %d",d); NODE *P; int x; printf("\n Nhap vao nut can tim: "); scanf("%d", &x); P = timnut(T, x); if (P != NULL) printf("\n Tim thay nut %d: ", P->key); else printf("\n nut %d khong co cay: ", x); if (xoanut(T, x)) printf("\n Xoa cong "); else printf("\n Khong tim thay nut %d can xoa: ", x); printf("\n Duyet cay theo ttt: "); ttt(T); printf("\n Duyet cay theo ttg: "); ttg(T); printf("\n Duyet cay theo tts: "); tts(T); printf("\n Chieu cao cay la: %d",ccaocay(T)); printf("\n so nut cua cay la:%d", demnut(T)); return 0; } 16 [Type text] III.2 Kết • Chương trình cho ta kết sau: - Xuất thứ tự duyệt : TTT, TTG, TTS - Đếm số nút - Xác định chiều cao - Xác định mức nút - Tìm nút - xóa thành công nút cần xóa - Thêm nút chưa có • Ví dụ: Nhập dãy số sau: 12 22 43 55 Chương trình xuất ra: Duyệt theo ttt: 12 22 43 55 Duyệt theo ttg: 12 22 43 55 Duyệt theo tts: 55 43 22 12 Số nút : Chiều cao là: Nhập nút: 12 Mức nút : Nhập nút : 12 Tìm thấy nút 12 Xóa thành công Duyệt theo ttt : 22 43 55 Duyệt theo ttg: 22 43 55 Duyệt theo tts: 55 43 22 Chiều cao : Số nút : IV KẾT LUẬN Sau thời gian tìm hiểu, nghiên cứu thực đề tài yêu cầu đề tài hoàn tất với nội dung sau: IV.1 Ưu điểm • Xây dựng chương trình “ tìm kiếm nhị phân” sử dụng thuật toán tìm kiếm node nhị phân • Chương trình sử lý nhanh tương đối xác IV.2 Khuyết điểm 17 [Type text] • Mặc dù cố gắng thời gian ngắn, kinh nghiệm hạn chế nên kết thiếu sót cần tiếp tục hoàn thiện để giải yêu cầu phức tạp • Chương trình nhiều lỗi như: vấn đề xử lý, hay thuật toán xóa nút chưa tối ưu,… IV.3 Hướng phát triển • Xây dựng hoàn thiện chức giúp người sử dụng dễ dàng hơn, phương pháp duyệt tối ưu hiệu Trên kết đạt số tồn tại, hướng phát triển đề tài Em xin chân thành cảm ơn quan tâm, giúp đỡ, nhiệt tình cô Trịnh Thị Phú giúp em hoàn thành đề tài Sinh viên thực Đỗ Viết Vũ TÀI LIỆU THAM KHẢO • Đỗ Xuân Lôi, Cấu trúc liệu giải thuật, nhà xuất Đại học Quốc gia Hà • Nội, 2006 Lê Minh Trung, Bài tập cấu trúc liệu giải thuật, Nhà xuất thống kê, 2005 • Donald Knuth The Art of Compter Programming, Volume 3: Sorting and Searching, Third Edition Addison-Wesley, 1997 ISBN 0-201-89685-0 Section 6.2.2: Binary Tree Searching, pp 426–458 18 [Type text] • Thomas H Cormen, Charles E Leiserson, Ronald L Rivest, and Clifford Stein Introduction to Algorithms, Second Edition MIT Press and McGraw-Hill, 2001 ISBN 0-262-03293-7 Chapter 12: Binary search trees, pp 253–272 Section 15.5: Optimal binary search trees, pp 356–363 19 ...[Type text] MỤC LỤC [Type text] Lời mở đầu Cùng với phát triển khoa học kĩ thuật , công nghệ thông tin nói chung