ĐỀ THI CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT ĐÁP ÁN

11 316 0
ĐỀ THI CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT  ĐÁP ÁN

Đ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

Câu 3: Trình bày (nn tựa C) giải thuật duyệt cây theo thứ tự trước, ko đệ quy, dùng stack Ý tưởng: 1. kiểm tra rỗng nếu cây rỗng thì kết thúc nếu không rỗng thì khởi tạo stack 2. thực hiện duyệt in ra khóa của nút gốc nếu cây con phải khác rỗng thì lưu địa chỉ gốc cây con phải vào stack chuyển xuống cây con trái, in ra khóa của nút con trái... (lặp lại) Giải thuật: T là con trỏ trỏ tới gốc cây đã cho. S là 1 ngăn xếp (stack) được cài đặt bằng mảng với biến trỏ TOP trỏ tới đỉnh. Con trỏ P được dùng để trỏ tới nút hiện đang được xét Có sử dụng các hàm PUSH và POP. PUSH: Bổ sung 1 phần tử vào ngăn xếp. POP: Loại 1 phần tử ở đỉnh ngăn xếp đang được trỏ bởi T. TT_TRUOC_S(T){ Hàm ko đệ quy duyệt cây theo thứ tự trước if (T==NULL){ 1kiểm tra rỗng printf(cay rong); return; } else { TOP = 1; PUSH(S,Top,T); }

ĐỀ Câu 3: Trình bày (nn tựa C) giải thuật duyệt theo thứ tự trước, ko đệ quy, dùng stack Ý tưởng: kiểm tra rỗng - rỗng kết thúc - khơng rỗng khởi tạo stack thực duyệt - in khóa nút gốc - phải khác rỗng lưu địa gốc phải vào stack - chuyển xuống trái, in khóa nút trái (lặp lại) Giải thuật: - T trỏ trỏ tới gốc cho - S ngăn xếp (stack) cài đặt mảng với biến trỏ TOP trỏ tới đỉnh - Con trỏ P dùng để trỏ tới nút xét - Có sử dụng hàm PUSH POP PUSH: Bổ sung phần tử vào ngăn xếp POP: Loại phần tử đỉnh ngăn xếp trỏ T TT_TRUOC_S(T){ if (T==NULL){ printf('cay rong'); return; } else { TOP = -1; PUSH(S,Top,T); } //Hàm ko đệ quy duyệt theo thứ tự trước //1-kiểm tra rỗng while (TOP>-1){ //2-thực duyệt P = POP(S,TOP); while (P!=NULL){ printf(P->DATA); //thăm nút, sau xuống trái //thăm P in if (P -> P_R != NULL) PUSH(S,TOP,P -> P_R); P = P -> P_L; //lưu địa gốc phải //xuống trái } } } câu 4: kiểm tra xem T có phải "cây nhị phân tìm kiếm" hay ko Ý tưởng: - tạo hàm tìm nút có giá trị lớn (max) - tạo hàm tìm nút có giá trị nhỏ (min) - tạo hàm kiểm tra xem có phải tìm kiếm nhị phân hay ko + rỗng nhị phân tìm kiếm (return 0) + kiểm tra trái (Left) có phải nhị phân tìm kiếm hay ko * chuyển xuống bước * sai return (cây nhị phân xét khơng phải nhị phân tìm kiếm) + kiểm tra nhị phân xét * trường hợp 1: xét có trái phải => tìm max trái(MaxL), phải(MinR) sau so sánh với khóa nút gốc => khơng thỏa mãn MaxL khơng thỏa mãn key < MinR nhị phân t.kiếm * trường hợp 3: xét có trái => tìm max cái, so sánh với khóa nút => khơng thỏa mãn MaxL < key khơng phải nhị phân t.kiếm + tiếp tục kiểm tra phải Giải thuật: TimMax(T,max){ //hàm tìm nút có khóa max if (T==NULL) return; if (T->P_L!=NULL) max = (max > T->P_L->key)?max:T->P_L->key; if (T->P_R!=NULL) max = (max > T->P_R->key)?max:T->P_R->key; max = (max > T->key)?max:T->key; TimMax(T->P_L,max); TimMax(T->P_R,max); } TimMin(T,min){ //hàm tìm nút có khóa if (T==NULL) return; if (T->P_L!=NULL) = (min < T->P_L->key)?min:T->P_L->key; if (T->P_R!=NULL) = (min < T->P_R->key)?min:T->P_R->key; = (min < T->key)?min:T->key; TimMin(T->P_L,min); TimMin(T->P_R,min); } KiemTra(T){ //nếu kết trả T nhị phân tìm kiếm ngược lại if (T==NULL) return 0; Left = KiemTra(T->P_L); If (Left) //cây khơng nhị phân tìm kiếm return 1; if (T->P_L!=NULL && T->P_R!=NULL){ //T có TimMax(T->P_L,MaxL); TimMin(T->P_R,MinR); if (!(MaxLkey && T->keyP_L==NULL && T->P_R!=NULL){ //T có phải TimMin(T->P_R,MinR); if (!(T->key < MinR)) return 1; } else if (T->P_L!=NULL && T->P_R==NULL){ TimMax(T->P_L,MaxL); if (!(MaxL < T->key)) return 1; } Right = KiemTra(T->P_R); return Left + Right; } //T có trái ĐỀ Câu 3: Trình bày giải thuật duyệt theo thứ tự giải thuật ko đệ quy có sử dụng Stack Ý tưởng: kiểm tra rỗng - rỗng kết thúc - khơng rỗng khởi tạo stack thực duyệt - lưu địa nút gốc vào stack, chuyển xuống trái (lặp lại bước tới trái rỗng) - lấy phần tử khỏi stack, trỏ vào vị trí nút - in khóa nút xét - trỏ đến phải - (lặp lại stack rỗng) Giải thuật: - T trỏ trỏ tới gốc cho - S ngăn xếp (stack) cài đặt mảng với biến trỏ TOP trỏ tới đỉnh - Con trỏ P dùng để trỏ tới nút xét - Có sử dụng hàm PUSH POP PUSH: Bổ sung phần tử vào ngăn xếp POP: Loại phần tử đỉnh ngăn xếp trỏ T TT_GIUA_S(T){ if (T==NULL){ printf("cây rỗng"); return; } else { TOP=-1; P=T; } while (TOP>-1 || P!=NULL){ while (P!=NULL){ PUSH (S,TOP,P); P=P->P_L; } P=POP(S,TOP); printf(P->DATA); P=P->P_R; } } Câu 4: chuyển đổi biểu thức trung tố sang hậu tố Ý tưởng: khởi tạo ngăn xếp (stack) rỗng đọc thành phần biểu thức - X tốn hạng viết vào biểu thức hậu tố (in ra) - X phép tốn thực hiện: + stack khơng rỗng thì: phần tử đỉnh stack phép tốn có độ ưu tiên cao phép tốn thời (X) phép tốn kéo khỏi stack viết vào biểu thức hậu tố (lặp lại bước này) + stack rỗng phần đỉnh ngăn xếp dấu mở ngoặc phép tốn đỉnh ngăn xếp có quyền ưu tiên thấp phép tốn thời (X) phép toán thời đẩy vào ngăn xếp - X dấu mở ngoặc đẩy vào stack - X dấu đóng ngoặc thực hiện: + (bước lặp):loại phép toán đỉnh ngăn xếp viết vào biểu thức dạng hậu tố đỉnh ngăn xếp dấu mở ngoặc + loại dấu mở ngoặc khỏi ngăn xếp sau toàn biểu thức dạng trung tố đọc, loại phép toán đỉnh stack viết vào biểu thức hậu tố stack rỗng Giải thuật: //giải thuật sử dụng stack S, trỏ T, lúc đầu T=-1 Convert(){ { Đọc thành phần X biểu thức; if (X toán hạng) printf(X); else if (X phép toán) { if ((T>-1) && (S[T] phép toán có độ ưu tiên cao X)) printf(POP(S,T)); if ((T==-1) || (S[T]=='(' || (S[T] phép tốn có độ ưu tiên thấp X) ) PUSH(S,T,X); } while (phép toán X đưa vào S) else if (X dấu '(' ) PUSH(S,T,X); else if (X dấu ')' ) { printf(POP(S,T)); //in phép toán while (S[T]==')'); POP(S,T); //loại dấu ')' khỏi stack } } while (chưa gặp dấu kết thúc biểu thức dạng trung tố); printf(POP(S,T)); while(T>-1); } //in phép toán ĐỀ Câu 3: Trình bày giải thuật tìm kiếm nhị phân Ý tưởng: - giả sử dãy ban đầu xếp theo thứ tự tăng dần (K0p (khơng tìm thấy, hàm trả -1) x = Kg (tìm thấy, trả g) Binary_Search(K,t,p,x){ if (t>p) return -1; //khơng tìm thấy g = (t+p)/2; // lấy phần tử else { if (x==K[g]) return g; //tìm thấy if (x Ttốt(n)= O(1) - trường hợp xấu nhất, phần tử cuối (hoặc đầu tiên) có giá trị x khơng có x dãy => dãy liên tiếp chia đôi ta phải gọi đệ quy dãy khóa đc xét phần tử - giả sử gọi w(n) hàm biểu thị số lượng phép so sánh trường hợp xấu nhất, ta có w(n) = + w([n/2]) w(n) = + + w([n/2^2]) w(n) = + + + w([n/2^3]) bước k ta có: w(n) = k + w([n/2^n]) (*) - trình gọi đệ quy dừng lại dãy phần tử, tức [n/2^k]=1 ta có, w([n/2^k]) = w(1) = 1, [n/2^k]=1 suy 2^k

Ngày đăng: 28/09/2019, 09:58

Từ khóa liên quan

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

Tài liệu liên quan