1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

18 339 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 389,29 KB

Nội dung

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!

Trang 2

       M C L CỤ Ụ

Trang 3

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.ệ

Trang 4

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.ề ủ ộ ề ủ ố

Trang 5

    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<stdlib.h>

#include<stdio.h>

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;

Trang 6

 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 và ch a có lá con bên trái thì th c hi n thêm vào bên tráiế ố ư ự ệ

­ Tương t  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.ậ

Trang 7

II.7 Hàm duy t cây   

II.7.1 Duy t theo th  t  tr  ệ ứ ự ướ

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:ợ

Trang 8

 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

Trang 9

       // ph n khai báo

#include<stdlib.h>

#include<stdio.h> 

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;

      return 0;

} // hàm thêm nút int themnut(TREE &T, int x) // chen 1 Node vao cay {

Trang 10

    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 {

    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 <0/1>");

scanf("%d",&tl);

    } } // Duyet theo TTT

Trang 11

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);    }

Trang 12

} // 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);

} // 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     {

Trang 13

        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)

Trang 14

    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 < 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);

    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));

Trang 15

    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;

}

Trang 16

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ố ủ

Trang 17

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ũ.ỗ ế

Trang 18

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

6.2.2: Binary Tree Searching, pp 426–458

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

Ngày đăng: 15/01/2020, 08:33

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w