Đề 04
1/2
Đề thì tuyển Nghiên cứu sinh và Cao học
Môn: Phương pháp lập trình, CTDL và giải thuật
Thời gian: 180 phút
Câu 1. Cho chương trình sau:
Program Chuyengiaomang(input,outphut);
Var i:integer;
A:arra ..2
Procedure p(var x,y:integre);
y[1 ]of interger;
Begin
{3} X:=x+1;
{4} Y:=y+1;
{5}
End;
Write(x,y);
BEGIN
{1} i:=1; A[1]:=2; A[2]:=0;
{2} P(i,a[a[i]]);
{7} writeln(i,a[1],a[2]);
{8} END.
a. Cho biết kết quả in ra.
b. Giải thích kết quả đó qua hành động của chương trình theo các bước từ {1}
đến {8}.
Bài 2. Giải thuật tìm kiếm nhị phân được thể hiện như sau:
Type kieuPT = integer;
Bang = array[1..n] of kieuPT {n>0 và bảng được sắp}
Function TimNhiPhan(k:kieuPT; var b:bang):integer;
Var t,p,g:integer; {trái,phải,giữa}
Begin
T:=1; p:=n;
Repeat
G:=(t+p) div 2;
if k>b[g] then t:=g
else p:=g;
until (b[g]=k)or(t>=p);
If b[g] = k then TimNhiPhan:=g {tìm được k}
Else TimNhiPhan:=0; {không tìm được}
End;
Hãy tìm một ví dụ b[1], b[2],…, b[n] chứng tỏ rằng giải thuật trên không đưa
ra kết quả mong muốn. Hãy chữa lại chương trình trên cho đúng.
Bài 3. Cho cây nhị phân với khai báo như sau:
Type tro = ↑nut;
Nut = record
Giatri:integer;
Contrai,conphai:tro;
Trình bày: Trần Hoài Nhân
Đề 04
2/2
End;
Var t:tro; {trỏ gốc của cây}
Hãy lập hàm:
Function copy(T:tro):tro;
Cho phép, với một cây có gốc
trỏ bởi T, lập một bản sao của cây đó (ở bộ nhớ trong) và cho lại địa chỉ của gốc
của cây mới này.
Bài 4. Với cây nhị phân được khai báo như ở bài 3, ta có thể tiến hành duyệt cây
theo một giải thuật không đệ quy theo sở đồ sau, trong đó có đúng một danh sách
tuyến tính để làm (các con trỏ tới) các nút cần ghi nhớ trong cây.
Nạp (con trỏ) gốc cây vào danh sách;
While danh sách không rỗng do
Begin
Lấy một nút từ danh sách, gọi đó là N;
Thăm N (chẳng hạn in giá trị của nó);
Nạp con trái của N vào danh sách (nếu có);
N
End;
ạp con phải của N vào danh sách (nếu có);
Tuy nhiên, tùy theo cách chọn nút N từ danh sách ra như thế nào, mà ta thành
lập được 2 giải thuật duyệt cây khác nhau:
- Giải thuật S (dùng stack): Lấy nút mới nhất (được nạp muộn nhất) trong
danh sách.
- Giải thuật Q (dùng queue): Lấy nút cũ nhất (đươc nạp sớm nhất) trong danh
sách.
a. Hãy cho biết các giải thuật S, Q duyệt cây sau đây theo các thứ tự nào?
1
2
3
4
5 6
987
b. Từ sự gợi ý của sơ đồ trên, hãy viết một thủ tục duyệt cây nhị phân theo thứ
tự preorder (gốc-trái-phải). Chú ý không được phá hoại cây đã cho và cố
gắng loại các động tác thừa. Thăm một nút được thể hiện bởi in giá trị của
nút đó ra.
Trình bày: Trần Hoài Nhân