Giáo trình Cấu trúc dữ liệu và giải thuật: Phần 2 - ĐH Sư phạm kỹ thuật Nam Định

98 46 0
Giáo trình Cấu trúc dữ liệu và giải thuật: Phần 2 - ĐH Sư phạm kỹ thuật Nam Định

Đ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

Tiếp nội dung phần 1, Giáo trình Cấu trúc dữ liệu và giải thuật: Phần 2 cung cấp cho người học những kiến thức như: Định nghĩa và khái niệm Cây; Một số phương pháp sắp xếp; Phân tích đánh giá các thuật toán; Bài toán tìm kiếm; Tìm kiếm tuần tự. Mời các bạn cùng tham khảo!

CHƢƠNG : CÂY 6.1 ĐỊNH NGHĨA VÀ KHÁI NIỆM a Định nghĩa Một tập hữu hạn nút có nút đặc biệt gọi gốc (root) Giữa nút có quan hệ phân cấp gọi "quan hệ cha " Có thể định nghĩa cách đệ quy sau : Một nút Nút gốc Nút n nút T1 , T2 , , Tk với n1, n2, , nk gốc, T tạo lập cách cho nút n trở thành cha nút n1 , n2 , , nk; nghĩa gốc lúc n1 , n2, , nk nút n Để tiện , người ta cho phép tồn khơng có nút nào, mà ta gọi rỗng (null tree) Ví dụ: Mục lục sách chương sách có cấu trúc Chẳng hạn, mục lục chương này: Chương : Cây 6.1 Định nghĩa khái niệm 6.2 Cây nhị phân 6.2.1 Định nghĩa tính chất 6.2.2 Biểu diễn nhị phân 6.2.3 Phép duyệt nhị phân 6.2.4 Cây nhị phân nối vòng 6.3 Cây tổng quát 6.3.1 Biểu diễn tổng quát 6.3.2 Phép duyệt tổng quát 6.4 áp dụng 6.4.1 Cây biểu diễn biểu thức 6.4.2 Cây biểu diễn tập 6.4.3 Các định Ta biểu diễn có dạng sau : 6.1 6.2.1 6.2 6.2.2 6.2.3 6.3 6.2.4 6.3.1 6.4 6.3.2 6.4.1 6.4.2 6.4.3 Hình 6.1 * Biểu thức số học x + y * (z- t ) + u/v biểu diễn dạng hình 6.2 + * Các tập bao biểu diễn hình 6.4 + / Đối với cây, chẳng hạn xét hình 6.1 x * u v Nút A gọi gốc y - B, C, D gốc của A z A cha B, C, D; B, C, D A t Hình 6.2 b Các khái niệm * Số nút gọi cấp (degree) nút Ví dụ cấp A 3, cấp H a b d f g e i c Hình 6.3 * Nút có cấp không gọi (deaf) hay nút tận (dermimal noder ) Ví dụ nút E, C, K, L v v … Nút không gọi nút nhánh ( branch node) Cấp cao nút gọi cấp Cây hình 6.4 cấp A B E C F D G I H M K Hình 6.4 * Gốc có số mức (level ) Nếu nút cha có số mức i nút có số mức i + Ví dụ: nút A có số mức D có số mức G có số mức J có số mức * Chiều cao (height) hay chiều sâu (depth) số mức lớn nút có Cây chiều hình 6.2 có chiều cao Cây chiều hình 6.4 có chiều cao Nếu n1 , n2, ….nk dãy nút mà ni cha ni + với  i < k, dãy gọi đường (path) từ n1 tới nk Độ dài đường (path length) nút đường trừ Ví dụ hình 6.4 độ dài đường từ A tới G 2, từ A tới K * Nếu thứ tự nút trọng xét có thứ tự (ordered tree), ngược lại khơng có thứ tự (unordered tree) Thường thứ tự nút đặt từ trái sang phải Hình 6.5 cho ta hai "cây có thứ tự " khác nhau: A B A C C Hình 6.5 B Đối với cây, từ quan hệ cha người ta mở rộng thêm quan hệ khác theo quan hệ gia tộc * Nếu có tập hữu hạn phân biệt ta gọi tập rừng (forest) Khái niệm rừng phải hiểu theo cách riêng : có cây, ta bỏ nút gốc ta có rừng! Như hình 6.4 bỏ nút gốc A đi, ta có rừng gồm 6.2 CÂY NHỊ PHÂN 6.2.1 Định nghĩa tính chất a Định nghĩa Cây nhị phân dạng quan trọng cấu trúc Nó có đặc điểm : nút có tối đa hai Đối với nút người ta phân biệt trái (left subtree) phải (right subtree) Như nhị phân có thứ tự Ví dụ : hình 6.2 nhị phân Các nhị phân sau khác Nhưng coi chúng ( hình 6.6) A A B C A A B D C E B B E C C D Ê E Hình 6.6 Cũng cần ý tới số dạng đặc biệt nhị phân, ví dụ: A B A A B A B C C D C C D D E D E E E a) B b) c) d) Đ E E A B C A A C B C B D H E F G D K E F G Hình 6.7 Các a) b) c) gọi nhị phân suy biến (degenerate binary tree) thực chất có dạng danh sách tuyến tính Riêng a) gọi lệch trái Riêng b) gọi lệch phải Riêng c)được gọi lệch zic – zắc Cây c) f) gọi nhị phân hoàn chỉnh (complete binary tree) Ở ta thấy : nút ứng với mức trừ mức cuối đạt tối đa Riêng f ) có nút tối đa mức nên gọi nhị phân đầy đủ (full binary tree) Cây nhị phân đầy đủ trường hợp đặc biệt nhị phân hoàn chỉnh Ta thấy ngay: nhị phân có số lượng nút nhị phân suy biến có chiều cao lớn nhất, cịn nhị phân hồn chỉnh có chiều cao nhỏ nhất, loại loại có dạng “cân đối” Tất khái niệm nêu 6.1 áp dụng vào nhị phân b Tính chất 1) Số lượng tối đa nút mức i nhị phân 2i – (i  1) 2) Số lượng tối đa nút nhị phân có chiều cao h 2h – (h  1) * Chứng minh Sẽ chứng minh qui nạp : Ta biết : Ở mức : i = 1, nhị phân có tối đa = 20 nút Ở mức : i = 2, nhị phân có tối đa = 21 nút Giả sử kết với mức i-1, nghĩa mức nhị phân có tối đa 2i-2 nút Mỗi nút i-1 có tối đa hai 2i – nút mức i-1 cho : 2i – x = 2i-1 nút tối đa mức i Bổ đề 1) chứng minh 3) Ta biết chiều cao số mức lớn có Theo 1) ta suy số nút tối đa có nhị phân với chiều cao h : 20 + 21 +22 + ….+ 2h-1 = 2h – * Từ kết ta suy ra: Nếu nhị phân hồn chỉnh có n nút chiều cao củat : h = [ log2 (n+1) ] (Ta qui ước x số nguyên x x số nguyên x nghĩa x  x  x ) 6.2.2 Biểu diễn nhị phân 1) Lƣu trữ Nếu có nhị phân hồn chỉnh đầy đủ, ta dễ dàng đánh số cho nút theo thứ tự từ mức trở lên, hết mức đến mức khác từ trái sang phải nút mức Ví dụ với hình 6.7 f) đánh số sau : A B C D E G F Hình 6.8 Ta thấy : Con nút thứ i nút thứ 2i 2i + Cha nút thứ j [ j/2 ] Nếu ta lưu trữ vectơ V, theo nguyên tắc: nút thứ i lưu trữ V[ i] Đó cách lưu trữ nhị phân Với cách lưu trữ biết địa nút cha tính địa nút ngược lại Như với đầy đủ nêu hình ảnh lưu trữ sau: A B C D E F G V[1] V[2] V[3] V[4] V[5] V[6] V[7] Tất nhiên nhị phân khơng đầy đủ cách lưu trữ khơng thích hợp gây lãng phí có nhiều phần tử nhớ bỏ trống (ứng với rỗng ) Chẳng hạn, lệch trái hình 6.7 a phải lưu trữ vectơ gồm 31 phần tử mà có phần tử khác rỗng, hình ảnh miền nhớ lưu trữ sau: A B  C    D        E (  chỗ trống ) Ngồi ln biến động nghĩa có phép bổ sung, loại bỏ nút thường xuyên tác động, cách lưu trữ tất không tránh nhược điểm nêu chương Cách lưu trữ móc nối sau vừa khắc phục nhược điểm này, vừa phản ánh dạng tự nhiên 2) Lƣu trữ móc nối Trong cách lưu trữ này, nút ứng với phần tử nhớ có qui cách sau: LPTR INFO RPTR - Trường INFO ứng với thông tin (dữ liệu) nút - Trường LPTR ứng với trỏ, trỏ tới trái nút - Trường RPTR ứng với trỏ, trỏ tới phải nút Ví dụ : nhị phân hình 6.9 có dạng lưu trữ móc nối hình 6.10 A B D C E F G Hình 6.9 H I A B D C E F G H I Hình 6.10 Để truy nhập vào nút cần có trỏ T, trỏ tới nút gốc Người ta qui ước: nhị phân rỗng T = null Với cách biểu diễn từ nút cha truy nhập vào nút dễ dàng, ngược lại khơng làm 6.2.3 Phép duyệt nhị phân 1) Khái niệm Thông thường ta hay phải thực phép xử lí nút theo thứ tự Ví dụ: biểu diễn biểu thức số học nêu hình 6.2, để xác định giá trị biểu thức ta phải xử lí nút sau: nút biểu diễn toán hạng ta xác định giá trị tốn hạng đó, nút biểu diễn dấu phép toán ta áp đặt phép tốn lên giá trị của nút Nhưng ta khơng thể thực phép tốn này, chưa xử lí Từ ta thấy ngay: thứ tự xử lí nút quan trọng Phép xử lí nút cây- mà ta gọi chung phép thăm (visit ) nút cách hệ thống, cho nút thăm lần, gọi phép duyệt Nếu hình dung nút với hai con, ta thấy qua nút theo đường mũi tên hình 6.11, ta gặp nút tới ba lần Từ hình thành ba phép duyệt khác nhị phân Hình 6.11 2) Các phép duyệt đệ quy theo thứ tự trƣớc, giữa, sau a) Duyệt theo thứ tự trƣớc (preorder traversal ) - Thăm gốc - Duyệt trái theo thứ tự trước - Duyệt phải theo thứ tự trước b) Duyệt theo thứ tự ( inorder traversal ) - Duyệt trái theo thứ tự - Thăm gốc - Duyệt phải theo thứ tự c) Duyệt theo thứ tự sau (postorder traversal ) - Duyệt trái theo thứ tự sau - Duyệt phải theo thứ tự sau Thăm gốc Chú ý rằng: Khi gặp rỗng "thăm " nghĩa " khơng làm " Với nhị phân hình 6.8, dãy tên ứng với nút thăm phép duyệt : a) Theo thứ tự trước b) Theo thứ tự ABDCEGFHI DBAEGCHFI c) Theo thứ tự sau DBGEHIFCA Với nhị phân hình 6.2, ta lại có: a) Theo thứ tự trước ++x*y -z t/u v b) Theo thứ tự x+y*z -t+u/ v c) Theo thứ tự xyz t - *+uv/+ Để ý ta thấy: a) dạng biểu thức tiền tố (prefix) c) dạng hậu tố (posfix) b) dạng trung tố (infix) Như phép duyệt nêu nhị phân biểu diễn biểu thức số học cho ta dạng kí pháp Ba Lan biểu thức số học Nếu viết dạng thủ tục đệ quy giải thuật phép duyệt nhị phân sau : Procedure PREORDER (T) { Thủ tục đệ quy duyệt nhị phân có nút gốc trỏ T theo thứ tự trước} Begin if T  null then Begin write (INFO(T)) ; PREORDER (LPTR(T)) ; PREORDER (RPTR(T)) End ; End; Procedure INORDER (T) { Thủ tục đệ quy duyệt nhị phân có nút gốc trỏ T theo thứ tự giữa} Begin if T  null then Begin INORDER (LPTR(T)) ; write (INFO(T)) ; INORDER (RPTR(T)) End ; End; Procedure POSTORDER (T) { Thủ tục đệ quy duyệt nhị phân có nút gốc trỏ T theo thứ tự sau} Begin if T  null then Begin POSTORDER (LPTR(T)) ; POSTORDER (RPTR(T)) ; write (INFO(T)) ; End ; End; 3) Các phép duyệt không đệ quy theo thứ tự trƣớc, giữa, sau Procedure PREORDER (T ) { Thủ tục không đệ quy duyệt nhị phân có nút gốc trỏ T theo thứ tự trước Sử dụng Stack S để nạp vào địa phải nút đường xuống lấy địa để xác định đường lên } Begin if T = null then Begin write ( ' rỗng ') ; dt *p,*q,*c,*k; p=a; q=b; c=NULL; while((p!= NULL)&&(q!=NULL)) { if(p->somu==q->somu) { if((p->heso-q->heso)!=0) c=Bosung(c,p->heso-q->heso,p->somu); p=p->link; q=q->link; } else if(p->somu>q->somu) { c=Bosung(c,p->heso,p->somu); p=p->link; } else { c=Bosung(c,-q->heso,q->somu); q=q->link; } } if(q==NULL) while(p!=NULL) { c=Bosung(c,p->heso,p->somu); p=p->link; } else while(q!=NULL) { c=Bosung(c,-q->heso,q->somu); q=q->link; } return c; } dt *tich(dt*a,dt*b) { dt *p,*q,*c,*k; p=a; c=NULL; while(p!= NULL) { q=b; while(q!=NULL) { k=c; while((k!=NULL)&&(k->somu!=p->somu+q->somu)) k=k->link; if(k!=NULL) k->heso=k->heso+p->heso*q->heso; else c=Bosung(c,p->heso*q->heso,p->somu+q->somu); q=q->link; } p=p->link; } return c; } //Dao ham bac nhat dt *Dao_ham(dt*a) { dt *p,*c; p=a; c=NULL; while(p!= NULL) { if(p->somu>0)c=Bosung(c,p->heso*p->somu,p->somu-1); p=p->link; } return c; } //Nguyen ham dt *Nguyen_ham(dt*a) { dt *p,*c; p=a; c=NULL; while(p!= NULL) { c=Bosung(c,p->heso/(p->somu+1),p->somu+1); p=p->link; } return c; } void main() { dt *a,*b,*c; int chon; float x; { clrscr(); printf("\n1 Dao ham bac nhat"); printf("\n2 Nguyen ham"); printf("\n3 Tinh gia tri da thuc"); printf("\n4 Tong hai da thuc"); printf("\n5 Hieu hai da thuc"); printf("\n6 Tich hai da thuc"); printf("\n7 Ket thuc chuong trinh"); printf("\nChon chuc nang(1->7):"); scanf("%d",&chon); switch(chon) { case 1: printf("\nNhap da thuc can tinh:"); a=nhap(); b=Dao_ham(a); printf("\nDao ham cua da thuc la:");hienthi(b); getch(); break; case 2: printf("\nNhap da thuc can tinh:"); a=nhap(); b=Nguyen_ham(a); printf("\nNguyen ham cua da thuc la:");hienthi(b); getch(); break; case 3: printf("\nNhap da thuc can tinh:"); a=nhap(); printf("x=");scanf("%f",&x); printf("\nGia tri cua da thuc tai x=%5.2f la:%5.2f",x,Gia_tri(a,x)); getch(); break; case 4: printf("\nNhap da thuc thu nhat:"); a=nhap(); printf("\nNhap da thuc thu hai:"); b=nhap(); c=tong(a,b); printf("Tong hai da thuc la:");hienthi(c); getch(); break; case 5: printf("\nNhap da thuc thu nhat:"); a=nhap(); printf("\nNhap da thuc thu hai"); b=nhap(); c=hieu(a,b); printf("Hieu hai da thuc la:");hienthi(c); getch(); break; case 6: printf("\nNhap da thuc thu nhat:"); a=nhap(); printf("\nNhap da thuc thu hai"); b=nhap(); c=tich(a,b); printf("Tich hai da thuc la:");hienthi(c); getch(); break; case 7:exit(1); } }while (chon!=7); } CÀI ĐẶT ĐA DANH SÁCH BIẺU DIỄN MA TRẬN THƢA Chương trình cài đặt cấu trúc đa danh sách biểu diễn ma trận thưa, nhập vào từ bàn phím ma trận thưa, tính tích hai ma trận in ma trận kết hình Chƣơng trình minh hoạ #include #include #include struct node { node *left,*up; int v,r,c; }; node *arow[10],*acol[10],*brow[10],*bcol[10],*crow[10],*ccol[10]; struct mt { int m,n,k; }; void input(mt &A) { printf("So hang:");scanf("%d",&A.m); printf("So cot:");scanf("%d",&A.n); printf("So phan tu khac khong:");scanf("%d",&A.k); } void createA(mt A) { int i,value,row,col; node *p,*q; for(i=1;ic=0; arow[i]->left=arow[i]; } for(i=1;ir=0; acol[i]->up=acol[i]; } for(i=1;iv=value; p->r=row; p->c=col; q=arow[p->r]; while(p->cleft)->c) q=q->left; p->left=q->left; q->left=p; q=acol[p->c]; while(p->rup)->r) q=q->up; p->up=q->up; q->up=p; } } void createB(mt B) { int i,value,row,col; node *p,*q; for(i=1;ic=0; brow[i]->left=brow[i]; } for(i=1;ir=0; bcol[i]->up=bcol[i]; } for(i=1;iv=value; p->r=row; p->c=col; q=brow[p->r]; while(p->cleft)->c) q=q->left; p->left=q->left; q->left=p; q=bcol[p->c]; while(p->rup)->r) q=q->up; p->up=q->up; q->up=p; } } void display(node *q) { node *p; p=q->left; while(p!=q) { printf("%3d cot %d;",p->v,p->c); p=p->left; } } void ht(mt A) { int i; for(i=1;ileft=crow[i]; } for(i=1;ir=0; ccol[i]->up=ccol[i]; } for(i=1;iup; result=0; while((p->c!=0)&&(q->r!=0)) if(p->c>q->r) p=p->left; else if(p->cr) q=q->left; else { result+=p->v*q->v; p=p->left; q=q->up; } if(result!=0) { t=(node*)calloc(1,sizeof(node)); t->v=result; t->r=i; t->c=j; t->left=crow[i]->left; t->up=ccol[j]->up; crow[i]->left=t; ccol[j]->up=t; } } } else printf("Hai ma tran khong cung kich thuoc"); } void main() { mt A,B,C; clrscr(); printf("\nNhap kich thuoc ma tran A\n"); input(A); printf("\nNhap gia tri cac phan tu khac khong cua A\n"); createA(A); printf("\nNhap kich thuoc ma tran B\n"); input(B); printf("\nNhap gia tri cac phan tu khac khong cua B\n"); createB(B); multi(A,B,C); printf("\nTich hai ma tran\n"); ht(C); getch(); } CÀI ĐẶT CÂY NHỊ PHÂN TÌM KIẾM Chương trình cài đặt nhị phân tìm kiếm kiểu móc nối, có nút chứa khố số ngun nhập từ bàn phím Chương trình gồm chức sau: a) Tạo nhị phân b) Duyệt nhị phân theo thứ tự trước giải thuật duyệt không đệ qui c) Duyệt nhị phân theo thứ tự giải thuật duyệt không đệ qui d) Duyệt nhị phân theo thứ tự sau giải thuật duyệt không đệ qui e) Bổ sung nút vào f) Loại bỏ nút có khố x cho trước g) Đếm số nút h) Tìm nút có khố tương ứng có giá trị lớn i) Tráo đổi tất nút trái phải Chƣơng trình minh hoạ #include”stdio.h” #include”conio.h” #include”alloc.h” typedef struct tree { int info; tree *lptr,*rptr; }; //Tao nut moi co info=x tree *taonut(int x) { tree *p; p = (tree*)malloc(sizeof(tree)); p->info = x; p->lptr = p->rptr = NULL; return p; } //Bo sung nut co info=x vao cay nhi phan tim kiem tree *Bosung(tree*t,int x) { tree *p,*r,*q; r = taonut(x); if(t==NULL) t = r; else { q = t; while(q!=NULL) { if(q->info==x) { printf(“\n nut da ton tai”); return t; } else if(x < q->info) { p = q; q = q->lptr; } else { p = q; q = q->rptr; } } if (x < p->info) p->lptr = r; else p->rptr = r; return t; } } //Tao cay nhi phan tim kiem tree *taocay() { int x; char ch; tree *t; t = NULL; { printf(“\nnhap khoa x=”);scanf(“%d”,&x); t = Bosung(t,x); printf(“Continue ? Y/N:”);fflush(stdin); scanf(“%c”,&ch); }while((ch!=‟N‟)&&(ch!=‟n‟)); return t; } //Loai bo nut co info=x tren cay nhi phan tim kiem tree *Loaibo(tree *t, int x) { tree *p, *q, *s,*r; p = t; while ((p!= NULL) && (p->info!=x)) { r = p; if(xinfo) p = p->lptr; else p = p->rptr; } if (p==NULL) printf(“khong co nut can loai bo”); else { if((p==t)&&(p->lptr==NULL)&&(p->rptr==NULL)) t=NULL; else { while((p->lptr!=NULL)||(p->rptr!=NULL)) { if(p->lptr!=NULL) { q=p->lptr; while(q->rptr!=NULL) { r=q; q=q->rptr; } } else { q=p->rptr; while(q->lptr!=NULL) { r=q; q=q->lptr; } } p->info=q->info; p=q; } free(p); } return t; } } void push(tree *s[30],int *top,tree *x) { if(*top < 30) { *top=*top+1; s[*top]=x; } else printf(“\n stack tran”); } tree *pop(tree *s[30],int *top) { if(*toplptr); printf(“%5d”,t->info); duyetdq(t->rptr); } } //Duyet cay nhi phan tim kiem theo thu tu truoc ko de qui void duyettruoc(tree *t) { tree *p; tree *s[30]; int top=0; if(t==NULL) printf(“\n cay rong:”); else { push(s,&top,t); while(top>0) { p=pop(s,&top); while(p!=NULL) { printf(“%5d”,p->info); if(p->rptr!=NULL) push(s,&top,p->rptr); p=p->lptr; } } } } //Duyet cay nhi phan tim kiem theo thu tu giua khong de qui void duyetgiua(tree *t) { tree *p; tree *s[30]; int top=0,tt; if(t==NULL) printf(“\n cay rong:”); else { p=t; { while(p!=NULL) { push(s,&top,p); p=p->lptr; } if(top>0) { p=pop(s,&top); printf(“%5d”,p->info); p=p->rptr; tt=1; } else tt=0; }while(tt==1); } } //Dem so nut la tren cay nhi phan tim kiem int demla(tree *t) { tree *p; tree *s[30]; int top=0, d=0; if(t!=NULL) { push(s,&top,t); while(top>0) { p=pop(s,&top); while(p!=NULL) { if(p->lptr==p->rptr) d++; if(p->rptr!=NULL) push(s,&top,p->rptr); p=p->lptr; } } } return d; } //Duyet cay nhi phan tim kiem khong de qui theo thu tu sau void duyetsau(tree *t) { int i=0,top=0,d[30]; tree *s[30]; tree *p; if(t==NULL) printf(“\n cay rong “); else { p=t; while(1) { while(p!=NULL) { push(s,&top,p); d[top]=1; p=p->lptr; } while(d[top]info); if(top==0) return ; } p=s[top]->rptr; d[top]=-d[top]; } } } //Dem so nut tren cay nhi phan tim kiem int demnut(tree *t) { if(t==NULL) return 0; else return 1+demnut(t->lptr)+demnut(t->rptr); } //Trao doi cay trai va cay phai void trao(tree *t) { tree *tg; if(t!=NULL) { trao(t->lptr); trao(t->rptr); tg=t->lptr; t->lptr=t->rptr; t->rptr=tg; } } //Tim nut co info lon nhat int Max(tree *t) { tree *p; p=t; if(p==NULL) printf(“Cay rong”); else while(p->rptr!=NULL) p=p->rptr; return p->info; } void main() { clrscr(); tree *t; int x,chon; { clrscr(); printf(“1 Tao cay\n”); printf(“2 Duyet cay theo thu tu truoc khong de qui\n”); printf(“3 Duyet cay theo thu tu giua khong de qui\n”); printf(“4 Duyet cay theo thu tu sau khong de qui\n”); printf(“5 Bo sung nut vao cay\n”); printf(“6 Loai bo nut khoi cay\n”); printf(“7 Dem so nut tren cay\n”); printf(“8 Tim nut co gia tri lon nhat tren cay\n”); printf(“9 Trao doi cay trai va cay phai\n”); printf(“Chon cong viec(1->9):”);scanf(“%d”,&chon); switch (chon) { case 1: clrscr(); printf(“\nNhap gia tri khoa cho cac nut tren cay”); t=taocay(); break; case 2: clrscr(); printf(“\nCac nut duyet cay theo thu tu truoc”); duyettruoc(t); getch(); break; case 3: clrscr(); printf(“\nCac nut duyet cay theo thu tu giua”); duyetgiua(t); getch(); break; case 4: clrscr(); printf(“\nCac nut duyet cay theo thu tu sau”); duyetsau(t); getch(); break; case 5: clrscr(); printf(“Gia tri khoa cua nut can bo sung x=”); scanf(“%d”,&x); Bosung(t,x); printf(“\nCac nut tren cay sau bo sung “); printf(“duoc duyet theo thu tu giua\n”); duyetdq(t); getch(); break; case 6: clrscr(); printf(“Gia tri khoa cua nut can loai bo x=”); scanf(“%d”,&x); Loaibo(t,x); printf(“\nCac nut lai sau loai bo “); printf(“duoc duyet theo thu tu giua\n”); duyetdq(t); getch(); break; case 7: clrscr(); printf(“\nSo nut tren cay:%5d”,demnut(t)); getch(); break; case 8: clrscr(); printf(“\nKhoa lon nhat tren cay:%5d”,Max(t)); getch(); break; case 9: clrscr(); printf(“\nCay sau trao doi “); printf(“traiphai duyet theo thu tu giua\n”); trao(t); duyetdq(t); getch(); break; } }while(chon!=10); } tài liệu tham khảo [1] Đỗ Xuân Lôi Cấu trúc liệu giải thuật Nhà xuất Thống kê 2001 [2] Đinh Mạnh Tường Cấu trúc liệu & giải thuật Nhà xuất Khoa học kỹ thuật 2003 [3] ROBERT SEDGEWICK Cẩm nang thuật toán Nhà xuất Khoa học kỹ thuật 2001 Vol Vol [4] LARRY NYHOFF, SANFORD LEEDSTMA Người dịch Lê Minh Trung Lập trình nâng cao Pascal với cấu trúc liệu Nhà xuất Đà Nẵng 2002.Vol.1 Vol.2 ... khoá đưa vào 42 23 74 11 36 99 87 42 - 23 42 - 23 42 74 11 23 42 11 23 36 11 23 36 11 23 36 - - - 74 - 42 58 65 74 42 58 65 74 42 58 65 74 - - - - 94 94 87 - - - - - 99 94 10 - - - - - - 99 Dấu... 65 58 94 36 99 87 ki lượt 42 23 74 11 65 58 94 36 99 87 (11 11 11 11 11 11 11 11 11 23 (23 23 23 23 23 23 23 23 36) 36) (36) 36 36 36 36 36 36 42 42 42 42 42 42 42 42 42 (65 (65 (65 (58) 58 58... nghĩa j = (lb+ub) /2 Lúc đó: Tt(n) = P(n) +2Tt(n /2) = cn + 2Tt(n /2) = cn + 2( cn /2 + 2T(n/4)) = 2cn + 4Tt(n/4) = 2cn + 22 Tt(n /22 ) = 3cn +23 Tt(n /23 ) = Người ta chứng minh Ctb = O(nlog2(n)) Đối với

Ngày đăng: 08/06/2021, 14:12

Từ khóa liên quan

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

Tài liệu liên quan