intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài tập lớn: Cây nhị phân tìm kiếm

Chia sẻ: Vuvu Vuvu | Ngày: | Loại File: DOCX | Số trang:18

357
lượt xem
25
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Sử dụng cấu trúc dạng cây, chúng ta cần dùng giải thuật nào với từng dạng dữ liệu để đạt hiệu quả cao nhất. Để giải quyết vấn đề trên ta cùng tìm hiểu một số phương pháp duyệt cây. Mời các bạn cùng tham khảo!

Chủ đề:
Lưu

Nội dung Text: Bài tập lớn: Cây nhị phân tìm kiếm

  1. [Type text] 1
  2. [Type text]                                                              M ỤC L ỤC 2
  3. [Type text] Lời mở đầu      Cùng với sự phát triển của khoa học kĩ thuật , công nghệ thông tin nói chung và  bộ môn cấu  trúc dữ liệu và giải thuật nói riêng ngày càng được ứng dụng rộng rãi  trong nhiều lĩnh vực. Với một cơ sở dữ liệu khổng lồ, việc đưa ra một phương  pháp nhằm giải quyết vấn đề tìm kiếm dữ liệu có hiệu quả và nhanh chóng nhất  luôn được sự quan tâm của các nhà phát triển phần mềm. Thông thường dữ liệu  được biểu diễn dưới dạng danh sách liên kết. Việc truy suất  dữ liệu chưa đạt hiệu  quả cao. Sử dụng cấu trúc dữ liệu cây là một giải pháp làm tăng hiệu suất trong các  thao tác xử lý. Vấn đề đặt ra : với việc sử dụng cấu trúc dạng cây, chúng ta cần  dùng giải thuật nào với từng dạng dữ liệu để đạt hiệu quả cao nhất. Để giải quyết  vấn đề trên ta cùng tìm hiểu một số phương pháp duyệt cây. 3
  4. [Type text] I.  CƠ SỞ LÝ THUYẾT  I.1.  Cây nhị phân tìm kiếm  Cây (Trees) là một tập hợp hữu hạn các phần tử gọi là nút cây (Node), trong  đó có một nút đặc biệt gọi là nút gốc (Root). Trên tập hợp các nút này có   một quan hệ phân cấp gọi là quan hệ "cha ­ con". Cây nhị phân tìm kiếm (binary search tree – BST) là cây nhị phân trong đó tại  mỗi nút, khóa của nút đang xét lớn hơn nút khóa của tất cả các nút thuộc cây  con trái và nhỏ hơn tất cả nút khóa thuộc cây con phải. Ví dụ I.2.  Một số khái niệm  Một nút đơn độc cũng là một cây. Tập hợp rỗng cũng là một cây mà ta gọi là cây rỗng.   Mức của một nút :                              + Nút gốc : Mức 0.                              + Các nút cách nút gốc i cạnh được gọi là nút ở mức i.  Nút gốc (Root): Là nút không có nút cha.   Nút lá (leaf): Là nút không có nút con. Chiều cao của một nút: Là độ dài đường đi từ nút đó đến nút lá xa nhất.. Chiều cao của một cây: Là chiều cao của nút gốc. 4
  5. [Type text]     Bậc của một nút: Là số nút con của nút đó. Bậc của một cây: Là bậc cao nhất của các nút trong cây. II.  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 cây nhị phân      Để biểu diễn cây nhị phân ta chọn phương pháp cấp phát liên kết. ứng với một  nút của, ta dùng một biến động lưu trữ các thông tin. Thông tin lưu trữ tại nút. Địa chỉ nút gốc của cây con trái trong bộ nhớ. Địa chỉ của nút gốc của cây con phải trong bộ nhớ. Khai báo tương ứng như sau: #include #include typedef int item ;  struct NODE { int key;  NODE *Left, *Right;  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; 5
  6. [Type text]  else      return 0; } II.4.  Hàm thêm một nút  Hàm này cho phép chúng ta nhập thêm một số vào dãy số mà ta đã nhập và  xét số đó để sắp xếp vào vị trí của một nút trong cây. Xảy ra hai trường hợp:  Cây rỗng.  Cây không rỗng. ­ Nếu X trùng với gốc thì ta không thể thêm node. ­ Nếu X gốc thì ta thêm vào bên phải. II.5.  Hàm xóa một nút.  Hàm cho phép ta xóa một nút trong cây tìm kiếm nhị phân. Xảy ra hai trường hợp.  Cây rỗng.  Cây khác rỗng.  ­ X là nút lá. ­  X chỉ có một con trái (phải). ­ X có đủ cả hai con 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í của nút cần xóa. II.6.  Hàm nhập một cây tìm kiếm nhị phân  ­ Cho phép ta nhập n số ta muốn, n số đó sẽ tạo thành n nút trong cây  nhị phân. ­ Hàm còn làm thêm nhiệm vụ sắp xếp vị trí đứng của các nút vừa  nhập. 6
  7. [Type text] II.7.  Hàm duyệt cây  II.7.1.  Duyệt theo thứ tự trước  Hàm có nhiệm vụ: ­ Thăm nút gốc. ­ Thăm các nút gốc của cây con trái theo thứ tự trước. ­ Thăm các nút gốc của cây con phải theo thứ tự trước. II.7.2.  Duyệt theo thứ tự giữa  Hàm có nhiệm vụ: ­ Thăm các nút gốc của cây con trái theo thứ tự giữa. ­ Thăm nút gốc. ­ Thăm các nút gốc của cây con phải theo thứ tự giữa. II.7.3.  Duyệt theo thứ tự sau  Hàm có nhiệm vụ sau: ­ Thăm các nút gốc của cây con trái theo thứ tự sau. ­ Thăm các nút gốc của cây con phải theo thứ tự sau. ­ Thăm nút gốc. II.8.  Hàm xác định số nút của cây  Sử dụng hàm để đếm xem trên cây có tất cả bao nhiêu nút. Xảy ra 2 trường hơp:  Cây rỗng số nút trên cây là 0.  Cây không rỗng: thì chiều cao cây sẽ tổng các nút bên trái và nút bên  phải của cây cộng với 1 ( 1 là nút gốc). II.9.  Hàm xác định chiều cao của cây  Hàm này sử dụng để tính chiều cao của cây nhị phân tức là đếm số tầng  của cây tìm kiếm nhị phân. Ta có các trường hợp sau: 7
  8. [Type text]  Trường hợp cây rỗng thì xuất ra chiều cao của cây là ­1.  Cây khác rỗng: ­ Không có cây con bên trái và bên phải thì chiều cao của cây là 0. ­ Có cả cây con bên trái và bên phải thì chiều cao là 1+ cây bên trái  + cây bên phải. ­ Cây cực trái hoặc cây cực phải thì chiều cao của cây là 1+ cây bên  trái hoặc 1 + cây bên phải. II.10.  Hàm xác định mức của cây  Hàm này sử dụng để xác định mức của một nút bất kỳ mà nười sử dụng  cần xác định, nút được nhập từ bàn phím.có sử dụng biếm đếm, mỗi lần  như thế lại cộng thêm một 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 một cây tìm kiếm nhị phân (nhãn của mỗi nút được  nhập từ bàn phím) .    Yêu cầu chi tiết:  1. Viết phần khai báo để cài đặt một cây tìm kiếm nhị phân.  2. Viết thủ tục khởi tạo cây rỗng.  3. Viết hàm kiểm tra cây rỗng.  4. Viết thủ tục xen một nút vào cây tìm kiếm nhị phân.  5. Viết thủ tục xóa một nút trong cây tìm kiếm nhị phân.  6. Viết thủ tục nhập một cây tìm kiếm nhị phân với nhãn của các nút của cây  được nhập vào từ bàn phím.  7. Viết các thủ tục duyệt cây:  Duyệt tiền tự, trung tự, hậu tự .       8. Viết hàm xác định số nút trong cây.  9. Thiết kế hàm xác định chiều cao của cây.  10. Viết hàm xác định mức của một nút trong cây.                                                                    BÀI LÀM 8
  9. [Type text]                      // 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 con phai }; int nmax(int a,int b){ return a>=b?a:b; } int d=0; 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 1 Node vao cay { 9
  10. [Type text]     if (T != NULL)     {         if (T­>key == x) return ­1;           if (T­>key > x) return themnut(T­>Left, x);         else if (T­>key 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 {     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 10
  11. [Type text] 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);    } } // duyet theo tt sau void tts(TREE T) {    if(T!=NULL)    {       tts(T­>Left);       tts(T­>Right);       printf("%d   ", T­>key);    } 11
  12. [Type text] } // 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 Right, x);     }     return NULL; } // dem nut int demnut(TREE T){ if(T==NULL) return 0; else return (demnut(T­>Right) + demnut(T­>Left) + 1); } // 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 Right, x);     else // T­>key == x     { 12
  13. [Type text]         TREE p = T;         if (T­>Left == NULL) T = T­>Right;    // Node chi co cay con phai         else if (T­>Right == NULL) T = T­>Left;   // Node chi co cay con  trai         else // Node co ca 2 con         {             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   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) 13
  14. [Type text]     return (1 + ccaocay(T­>Left)); } // hàm xác định mức của một nút void muc(TREE T, int x)  {     if (T!=NULL)     {      d++;         if (T­>key > x) muc(T­>Left, x);         if (T­>key 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);     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)); 14
  15. [Type text]     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 trong cay: ", x);       if (xoanut(T, x)) printf("\n  Xoa thanh 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; } 15
  16. [Type text] III.2.  Kết quả  Chương trình cho ta được kết quả sau: ­ Xuất ra được các thứ tự duyệt :  TTT, TTG, TTS. ­ Đếm được số nút của cây. ­ Xác định được chiều cao của cây. ­ Xác định được mức của nút. ­ Tìm nút của cây. ­ xóa thành công nút cần xóa trên cây. ­ Thêm được các nút chưa có trên cây. Ví dụ: Nhập một 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 của cây là : 4 Chiều cao của cây là: 3 Nhập nút: 12 Mức của nút là : 1 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 của cây : 2 Số nút của cây : 3 16
  17. [Type text] IV.  KẾT LUẬN      Sau một thời gian tìm hiểu, nghiên cứu và thực hiện đề tài các yêu cầu  chính của đề tài cơ bản đã hoàn tất với các nội dung sau: IV.1.  Ưu điểm  Xây dựng được chương trình “ tìm kiếm cây nhị phân” sử dụng các  thuật   toán tìm kiếm được các node trên cây nhị phân. Chương trình sử lý nhanh và tương đối chính xác. IV.2.  Khuyết điểm  Mặc dù rất cố gắng nhưng trong thời gian ngắn, kinh nghiệm còn hạn  chế nên kết quả còn thiếu sót cần tiếp tục được hoàn thiện để có thể  giải được các yêu cầu phức tạp hơn. Chương trình còn nhiều lỗi như: về vấn đề xử  lý, hay thuật toán xóa  nút còn chưa tối ưu,…. IV.3.  Hướng phát triển  Xây dựng hoàn thiện các chức năng giúp người sử dụng dễ dàng hơn,  các phương pháp duyệt tối ưu và hiệu quả hơn.     Trên đây là kết quả đạt được cũng như còn một số tồn tại, hướng phát triển của  đề tài.     Em xin chân thành cảm ơn sự quan tâm, giúp đỡ, nhiệt tình của cô Trịnh Thị Phú  giúp em hoàn thành đề tài này. Sinh viên thực hiện.       Đỗ Viết Vũ. 17
  18. [Type text] TÀI LIỆU THAM KHẢO Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, nhà xuất bản Đại học Quốc gia Hà  Nội, 2006 Lê Minh Trung, Bài tập cấu trúc dữ liệu và giải thuật, Nhà xuất bản 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. 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. 18
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2