Danh sách câu hỏi của đề

Câu hỏi: CSD201 Cấu trúc dữ liệu và giải thuật – Bộ ôn tập thi lại số 3

50 câu trắc nghiệm kèm lời giải của môn CSD201 - Cấu trúc dữ liệu và giải thuật, xếp đúng thứ tự trong đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
A2, 3, 7, 5, 11, 12, 10, 4, 8, 6
B2, 3, 11, 12, 5, 10, 7, 4, 8, 6
C2, 3, 11, 12, 5, 10, 7, 4, 6, 8
D2, 3, 11, 12, 10, 5, 7, 4, 8, 6
Lời giải
Đáp án đúng: "2, 3, 11, 12, 5, 10, 7, 4, 8, 6". Selection sort mỗi lượt tìm phần tử nhỏ nhất của đoạn chưa sắp rồi hoán vị nó với phần tử đứng đầu đoạn, chứ không dịch cả dãy. Lượt i = 0: nhỏ nhất trong cả mười số là 2, nó đổi chỗ với 7 cho 2, 5, 11, 12, 3, 10, 7, 4, 8, 6. Lượt i = 1: nhỏ nhất của đoạn còn lại là 3, nó đổi chỗ với 5 cho 2, 3, 11, 12, 5, 10, 7, 4, 8, 6. "2, 3, 7, 5, 11, 12, 10, 4, 8, 6" sai vì nó dồn các số lớn sang phải một ô theo kiểu insertion sort, trong khi mã giả chỉ swap đúng hai phần tử nên 11 và 12 phải đứng nguyên chỗ. "2, 3, 11, 12, 5, 10, 7, 4, 6, 8" sai vì nó đổi thêm 8 với 6 ở cuối dãy, còn hai lượt đầu chưa hề chạm tới đuôi. "2, 3, 11, 12, 10, 5, 7, 4, 8, 6" sai vì nó đưa 5 vào ô đang giữ 10, trong khi hoán vị phải đặt 5 vào đúng ô mà 3 vừa rời đi.
Mở trang câu hỏi này →
A1
B-1
C2
D0
Lời giải
Đáp án đúng: "0". Chèn lần lượt 6, 3, 7, 2, 5, 1: sau bốn khoá đầu cây là 6 với con trái 3, con phải 7, còn 2 làm con trái của 3; thêm 5 thành con phải của 3; tới khoá 1 thì nó xuống làm con trái của 2, lúc này nhánh trái của 6 cao ba tầng còn nhánh phải chỉ có 7, nên hệ số cân bằng của 6 bằng -2 và cây lệch trái ở phía nhánh trái. Phép quay phải tại 6 đưa 3 lên làm gốc, 2 giữ con trái 1, còn 6 nhận 5 làm con trái, 7 làm con phải. Hai con của 6 đều là lá nên hai nhánh cao bằng nhau và hiệu chiều cao bằng 0. Số đo "-1" đòi nhánh trái cao hơn nhánh phải một tầng, nhưng sau khi quay thì 5 với 7 cùng là lá. Số đo "1" đòi nhánh phải cao hơn một tầng, cũng không có vì cả hai nhánh chỉ gồm một lá. Số đo "2" là mức lệch nặng về bên phải, trong khi trước lúc quay cây này lệch về bên trái.
Mở trang câu hỏi này →
A6, 7, 8, 9, 3, 2, 5, 4
B6, 3, 2, 7, 5, 8, 4, 9
C6, 3, 7, 2, 5, 8, 4, 9
D6, 5, 7, 2, 3, 8, 4, 9
Lời giải
Đáp án đúng: "6, 3, 7, 2, 5, 8, 4, 9". Chèn lần lượt 6, 7, 8, 9, 3, 2, 5, 4 vào cây tìm kiếm rỗng cho cây: 6 là gốc, 7 là con phải của 6, 8 là con phải của 7, 9 là con phải của 8, 3 là con trái của 6, 2 là con trái của 3, 5 là con phải của 3, còn 4 nhỏ hơn 5 nên thành con trái của 5. Duyệt theo chiều rộng đọc từng mức từ trên xuống, trong mỗi mức đi từ trái sang phải: mức một có 6, mức hai có 3 và 7, mức ba có 2, 5 và 8, mức bốn có 4 và 9. "6, 7, 8, 9, 3, 2, 5, 4" chỉ là thứ tự chèn, nó vét hết nhánh phải trước khi chạm nhánh trái nên không phải đọc theo mức. "6, 3, 2, 7, 5, 8, 4, 9" đặt 2 ngay sau 3, tức xuống mức ba khi mức hai chưa đọc hết nút 7. "6, 5, 7, 2, 3, 8, 4, 9" coi 5 là con trái của 6, nhưng 5 lớn hơn 3 nên khi chèn nó phải rẽ phải tại nút 3 và nằm ở mức ba.
Mở trang câu hỏi này →
Aa, c, d, e, b, a
Ba, b, c, e, d, a
Ca, b, c, d, e, a
Da, b, e, d, c, a
Ea, e, d, c, b, a
Lời giải
Đáp án đúng: "a, b, c, d, e, a". Thuật toán luôn lấy đỉnh kề chưa dùng đứng đầu theo thứ tự chữ cái và chỉ quay lui khi bế tắc. Đồ thị có các cạnh a–b, a–c, a–e, b–c, b–e, c–d, c–e, d–e. Bắt đầu H chỉ có a; đỉnh kề của a là b, c, e nên chọn b; đỉnh kề của b là a, c, e, bỏ a đã có nên chọn c; đỉnh kề của c là a, b, d, e nên chọn d; đỉnh kề của d là c, e nên chọn e; lúc này H đủ năm đỉnh và e kề a nên chu trình đóng lại, không phải quay lui lần nào. "a, c, d, e, b, a" bỏ b ngay bước đầu dù b đứng trước c theo chữ cái. "a, b, c, e, d, a" chọn e trước d tại c, trái thứ tự chữ cái, và d lại không kề a nên còn không đóng được chu trình. "a, b, e, d, c, a" chọn e tại b dù c đứng trước e. "a, e, d, c, b, a" chọn e ngay tại a dù b và c đều đứng trước.
Mở trang câu hỏi này →
Đề bài
while(there are more characters in the word to read)

{read a character if a character is '*' then pop and write the poped character to the screen

Đề bài
  else
  push the character into the stack
}

What is written to the screen for the input "Good**Morn**i***ng" ?

Adonrioo
BdonrioM
CdonrioG
DdonriMG
Lời giải
Đáp án đúng: "donrioM". Ngăn xếp nhả theo nguyên tắc vào sau ra trước, nên mỗi dấu sao lấy đúng ký tự vừa được đẩy vào gần nhất. Chạy tay trên Good hai sao Morn hai sao i ba sao ng: đẩy G, o, o, d rồi hai dấu sao nhả d và o, ngăn xếp còn G, o; đẩy M, o, r, n rồi hai dấu sao nhả n và r, ngăn xếp còn G, o, M, o; đẩy i rồi ba dấu sao nhả i, o và M; hai ký tự n, g cuối chỉ được đẩy vào mà không còn dấu sao nào. Ghép theo thứ tự nhả được d, o, n, r, i, o, M. Vì vậy "donrioo" sai vì ở lần nhả thứ bảy đỉnh ngăn xếp là M chứ không phải o; "donrioG" sai vì G nằm dưới cùng, phải nhả M rồi o rồi mới tới nó; "donriMG" sai vì ngay sau khi nhả i thì đỉnh là o của Good, nó bỏ qua ký tự đang nằm trên M.
Mở trang câu hỏi này →
ABoth best and worst cases are O(nlogn)
BThe best case is O(n), and the worst case is O(nlogn)
CBest case is O(nlogn) , the worst case is O(n^2)
DThe best case is O(n), and the worst case is O(n^2)
Lời giải
Đáp án đúng: "Both best and worst cases are O(nlogn)". Mergesort chia mảng làm hai nửa theo chỉ số giữa, hoàn toàn không phụ thuộc giá trị dữ liệu, nên cây đệ quy luôn sâu khoảng log2(n) mức; ở mỗi mức phép trộn quét qua đủ n phần tử, cho tổng khoảng n nhân log2(n) cho cả trường hợp tốt nhất lẫn xấu nhất. Phương án "The best case is O(n), and the worst case is O(nlogn)" sai vì ngay cả khi mảng đã sắp sẵn, bản mergesort chuẩn vẫn trộn từng cặp nửa ở mọi mức, không có bước dò nào cho phép bỏ qua. Phương án "Best case is O(nlogn) , the worst case is O(n^2)" là mô tả của quicksort, nơi chốt lệch làm cây đệ quy suy biến thành n mức; mergesort không chọn chốt nên không gặp cảnh đó. Phương án "The best case is O(n), and the worst case is O(n^2)" ghép trường hợp tốt của insertion sort với trường hợp xấu của quicksort, không khớp bước nào của mergesort.
Mở trang câu hỏi này →
Aqueue
Bstack
Clist
Dnone of the above
Lời giải
Đáp án đúng: "queue". Duyệt theo chiều rộng phải thăm hết các đỉnh cách nguồn một cạnh trước khi sang lớp cách hai cạnh, nên cấu trúc giữ các đỉnh đang chờ phải nhả ra đúng theo thứ tự đã nạp vào: đỉnh nào được phát hiện trước thì được mở rộng trước. Hàng đợi vào trước ra trước cho đúng tính chất đó, và cũng chính nó làm BFS tìm được đường đi ít cạnh nhất trên đồ thị không trọng số. Phương án "stack" cho vào sau ra trước, nên đỉnh vừa phát hiện bị mở rộng ngay và thuật toán bị kéo chạy sâu xuống một nhánh trước khi quay lại; đó là duyệt theo chiều sâu. Phương án "list" chỉ là vật chứa chung, bản thân nó không quy định lấy ra ở đầu hay ở cuối, nên không bảo đảm được thứ tự theo lớp; muốn dùng danh sách thì vẫn phải thao tác nó đúng như một hàng đợi. Phương án "none of the above" sai vì hàng đợi đã nằm sẵn trong các lựa chọn.
Mở trang câu hỏi này →
Đề bài
int x = 5;
Node f = p.prev; // prev is a link to predecessor node
Node q = new Node(x); // Create new node with value x
q.prev = f; q.next = p;
f.next = q; p.prev = q;
A7 11 6 4 3 5 9 8 12
B5 7 11 6 4 3 9 8 12
C7 11 6 4 3 9 8 12 5
D7 11 6 4 3 9 8 5 12
E7 11 6 4 3 9 5 8 12
Lời giải
Đáp án đúng: "7 11 6 4 3 5 9 8 12". Trong danh sách liên kết đôi, p trỏ nút 9 nên f = p.prev chính là nút 3; nút mới q mang giá trị 5 được gắn q.prev = f và q.next = p, rồi hai liên kết ngược chiều f.next = q cùng p.prev = q khâu q vào đúng khe giữa 3 và 9, nghĩa là chèn ngay trước p. "5 7 11 6 4 3 9 8 12" sai vì đoạn mã không hề chạm tới head; muốn 5 lên đầu thì p phải là nút đầu tiên của danh sách. "7 11 6 4 3 9 8 12 5" sai vì chèn vào cuối cần f là nút cuối và q.next phải là null, không phải q.next = p. "7 11 6 4 3 9 8 5 12" sai vì kết quả đó ứng với p trỏ nút 12 chứ không phải nút 9. "7 11 6 4 3 9 5 8 12" sai vì đó là chèn sau p, muốn vậy phải viết q.prev = p và q.next = p.next.
Mở trang câu hỏi này →
A7
Binfinity
C8
D9
Lời giải
Đáp án đúng: "7". Dijkstra khởi đầu ở A với nhãn 0, các cung ra cho B nhãn 3, D nhãn 5, C nhãn 6. Chọn B vì 3 nhỏ nhất: cung B–C trọng số 1 hạ nhãn của C xuống 4, cung B–E trọng số 5 cho E nhãn 8. Chọn C vì 4 nhỏ nhất: cung C–E trọng số 3 hạ nhãn của E xuống 4 cộng 3 bằng 7, còn nhãn của D giữ 5 vì đường qua C dài 8. Chọn D rồi cung D–F trọng số 1 cho F nhãn 6. Lúc này F với 6 nhỏ hơn E với 7 nên F được chốt, và nhãn của E khi ấy bằng 7. Số "8" là nhãn tạm của E lấy qua B, trước khi đường qua C làm nó tốt hơn. Số "9" là tổng 6 cộng 3, tức dùng trọng số cung A–C bằng 6 thay cho nhãn đã rút ngắn của C là 4. Giá trị "infinity" chỉ đúng với đỉnh chưa hề có đường tới, còn E nhận nhãn ngay từ lúc B được chốt.
Mở trang câu hỏi này →
A12, 13, 14, 15, 17, 19, 16, 18
B12, 13, 15, 14, 17, 19, 16, 18
C12, 13, 14, 15, 16, 17, 19, 18
D12, 13, 14, 15, 17, 16, 18, 19
Lời giải
Đáp án đúng: "12, 13, 14, 15, 17, 19, 16, 18". Chốt là x bằng a[low] tức 15, i bắt đầu ở 0, j ở 7. Vòng một: i chạy lên và dừng ở 18 vì 18 lớn hơn 15, j dừng ngay ở 14 vì 14 không lớn hơn 15, đổi chỗ hai số đó được 15, 13, 14, 19, 17, 12, 16, 18. Vòng hai: i dừng ở 19, j lùi qua 18 và 16 rồi dừng ở 12, đổi chỗ được 15, 13, 14, 12, 17, 19, 16, 18. Vòng ba: i dừng ở 17, j lùi qua 19 và 17 rồi về 12, lúc này i đã vượt j nên không đổi chỗ và vòng lặp dừng; bước cuối đổi a[low] là 15 với a[j] là 12. "12, 13, 15, 14, 17, 19, 16, 18" để 15 trước 14, nghĩa là chốt không về đúng vị trí phân hoạch của nó. "12, 13, 14, 15, 16, 17, 19, 18" đã sắp lại cả phần bên phải chốt. "12, 13, 14, 15, 17, 16, 18, 19" cũng vậy, trong khi một lượt phân hoạch chỉ bảo đảm bên trái chốt không lớn hơn chốt và bên phải không nhỏ hơn, chứ không sắp xếp nội bộ hai phần.
Mở trang câu hỏi này →
AAABBABCB
BCAABBBAC
CAABBBCBC
DAABBBCAB
Lời giải
Đáp án đúng: "AABBABCB". Trên cây, nhánh phải của gốc là lá A nên A = 1; nhánh trái dẫn tới nút trong có lá B ở nhánh 0 và lá C ở nhánh 1, nên B = 00 và C = 01. Đây là mã tiền tố nên đọc thẳng từ trái sang phải không cần dấu phân cách. Đọc 1100001000100: 1 ra A, 1 ra A, 00 ra B, 00 ra B, 1 ra A, 00 ra B, 01 ra C, 00 ra B, vừa hết 13 bit. "CAABBBAC" mở đầu bằng C nên đòi hai bit đầu là 01, còn chuỗi đã cho mở đầu bằng 11. "AABBBCBC" khớp bốn mã đầu rồi coi bit thứ bảy là 0 để ghép thành 00, nhưng bit thứ bảy là 1 nên chỉ có thể đọc ra A. "AABBBCAB" mắc đúng chỗ đó và còn đòi đoạn cuối là 1 rồi 00, trong khi bốn bit cuối của chuỗi là 0100.
Mở trang câu hỏi này →
A2, 3, 4, 5, 7, 9, 6, 8
B2, 3, 5, 4, 7, 9, 6, 8
C2, 3, 4, 5, 6, 7, 9, 8
D2, 3, 4, 5, 7, 6, 8, 9
Lời giải
Đáp án đúng: "2, 3, 4, 5, 7, 9, 6, 8". Chốt là x bằng a[0] tức 5; i dò từ đầu mảng và dừng ở phần tử lớn hơn 5, j dò từ cuối mảng và dừng ở phần tử nhỏ hơn hoặc bằng 5, rồi đổi chỗ hai phần tử đó. Trên 5, 3, 8, 9, 7, 2, 6, 4: i dừng ở 8, j dừng ở 4, đổi được 5, 3, 4, 9, 7, 2, 6, 8; tiếp tục i dừng ở 9, j dừng ở 2, đổi được 5, 3, 4, 2, 7, 9, 6, 8; lượt ba i dừng ở 7 còn j lùi về đúng số 2, hai con trỏ đã vượt nhau nên vòng lặp dừng; cuối cùng đổi chốt 5 với số 2 tại vị trí j, cho 2, 3, 4, 5, 7, 9, 6, 8 với 2, 3, 4 ở trái chốt và 7, 9, 6, 8 ở phải. Vì vậy "2, 3, 5, 4, 7, 9, 6, 8" sai vì nó đưa chốt về ô thứ ba, tức đổi chốt với một j lùi chưa đủ; "2, 3, 4, 5, 6, 7, 9, 8" sai vì nó sắp lại phần bên phải chốt; "2, 3, 4, 5, 7, 6, 8, 9" cũng sai vì vậy, một lần phân hoạch chỉ chia hai phía so với chốt và để nguyên trật tự nội bộ 7, 9, 6, 8.
Mở trang câu hỏi này →
AB, A, E, G, F, D, C
BB, A, E, G, C, D, F, H
CB, A, C, E, G, F, D, H
DB, A, E, G, F, D, C, H
Lời giải
Đáp án đúng: "B, A, E, G, F, D, C, H". Các cạnh là A–B, A–E, A–G, B–C, B–E, C–D, D–F, E–G, F–G và H đứng riêng. Đi sâu từ B: lân cận của B theo thứ tự chữ cái là A, C, E nên chọn A; từ A còn E và G, chọn E; từ E còn G nên sang G; từ G còn F nên sang F; từ F còn D nên sang D; từ D còn C nên sang C; tới đây mọi lân cận đã thăm nên lùi hết về B, được B, A, E, G, F, D, C. Vì H chưa thăm, phép duyệt khởi động lại ở H và kết thúc bằng H. Dãy "B, A, E, G, F, D, C" đúng phần thân nhưng bỏ đỉnh cô lập H, trong khi duyệt cả đồ thị phải lặp lại ở mọi đỉnh chưa thăm. Dãy "B, A, E, G, C, D, F, H" sai ngay sau G vì C không kề G, mà đi sâu chỉ được bước sang đỉnh kề đỉnh đang đứng. Dãy "B, A, C, E, G, F, D, H" cho C ngay sau A, nhưng C chỉ kề B và D, nên muốn thăm C phải lùi về B dù A còn E và G chưa thăm.
Mở trang câu hỏi này →
Đề bài
Node f = head;
while(f.next != tail) f = f.next;
f.next = null;
tail = f;
AIt deletes some middle node in the list.
BIt deletes node before the last node.
CIt deletes the last node.
DIt does not make any change on the list.
Lời giải

Đáp án đúng: "It deletes the last node.". Vòng lặp while(f.next != tail) f = f.next; dừng lại đúng khi f là nút có liên kết trỏ tới tail, tức nút kế cuối; sau đó f.next = null cắt liên kết tới nút cuối và tail = f dời đuôi lùi về nút kế cuối. Nút cuối cũ không còn ai trỏ tới nên bị loại khỏi danh sách. Vì danh sách có ít nhất 2 nút nên head khác tail và f.next khác null ngay từ đầu, vòng lặp an toàn. Phương án "It deletes node before the last node." sai vì nút kế cuối chính là f và nó được giữ lại làm đuôi mới, không hề bị bỏ. Phương án "It deletes some middle node in the list." sai vì điều kiện dừng neo vào tail nên vòng lặp luôn chạm chính xác vị trí cuối, không phải một nút giữa bất kỳ. Phương án "It does not make any change on the list." sai vì hai lệnh gán cuối đổi thật: một liên kết next bị xoá và biến tail bị trỏ lại.

Mở trang câu hỏi này →
Đề bài
int x = 5;
Node f = head;
while(f.next != p) f = f.next;
Node q = new Node(x);
q.next = p;
f.next = q;
A7 11 6 14 5 3 9 8 12
B7 11 6 14 3 5 9 8 12
C7 11 6 14 3 9 8 12 5
D7 5 11 6 14 3 9 8 12
E7 11 6 14 3 9 8 5 12
Lời giải
Đáp án đúng: "7 11 6 14 5 3 9 8 12". Danh sách chỉ liên kết một chiều nên không lùi được từ p; vòng lặp while(f.next != p) f = f.next chạy từ head để dừng đúng ở nút đứng liền trước p, tức nút 14. Sau đó q.next = p và f.next = q nối nút 5 vào giữa 14 và 3, nghĩa là chèn ngay trước p. "7 11 6 14 3 5 9 8 12" sai vì đó là chèn sau p, muốn vậy phải viết q.next = p.next rồi p.next = q. "7 11 6 14 3 9 8 12 5" sai vì vòng lặp dừng ở nút trước p, không bao giờ đi tới nút cuối. "7 5 11 6 14 3 9 8 12" sai vì nó ứng với việc dùng ngay f = head mà bỏ qua vòng lặp đi tìm nút trước p. "7 11 6 14 3 9 8 5 12" sai vì vị trí đó đòi p phải trỏ nút 12 chứ không phải nút 3.
Mở trang câu hỏi này →
Đề bài
while(there are more characters in the word to read)

{read a character if a character is '*' then dequeue and write the dequeued character to the screen

Đề bài
  else
  enqueue the character into the queue
}

What is written to the screen for the input "HowAre***You**To****Day" ?

AowAreYouT
BHowAreYo
CHowAreYou
DwAreYouTo
Lời giải
Đáp án đúng: "HowAreYou". Hàng đợi lấy ra theo đúng thứ tự đã nạp vào, và mỗi dấu sao là một lệnh lấy ra rồi in ký tự vừa lấy, nên số ký tự in bằng số dấu sao. Chuỗi vào nạp H, o, w, A, r, e; ba dấu sao in H, o, w; nạp Y, o, u; hai dấu sao in A rồi r; nạp T, o; bốn dấu sao in e, Y, o, u; cuối cùng nạp D, a, y mà không còn dấu sao nào. Chín dấu sao cho đúng chín ký tự theo lối vào trước ra trước, còn T, o, D, a, y nằm lại trong hàng đợi. Chuỗi "HowAreYo" chỉ có tám ký tự, tức bỏ sót một lần lấy ra so với chín dấu sao đã đọc. Chuỗi "owAreYouT" khởi đầu ở o như thể H bị bỏ qua, nhưng H vào hàng đợi đầu tiên nên phải ra đầu tiên. Chuỗi "wAreYouTo" khởi đầu ở w nên mất cả H lẫn o, lại chen T vào cuối, trong khi T mới nạp sau khi hai dấu sao đã đẩy A rồi r ra ngoài và nó vẫn còn trong hàng đợi.
Mở trang câu hỏi này →
Avoid push(Integer x) { Node p = new Node(x); p.next = head; head=p.next; }
Bvoid push(Integer x) { Node p = new Node(x); p.next = head; }
Cvoid push(Integer x) { Node p = new Node(x); p.next = null; head=p; }
Dvoid push(Integer x) { Node p = new Node(x); p.next = head; head=p; }
Lời giải

Đáp án đúng: "

Lời giải
void push(Integer x) {
  Node p = new Node(x);
  p.next = head;
  head=p;
}

". Ngăn xếp cài bằng danh sách liên kết đơn với đỉnh là đầu danh sách cần đúng hai việc theo đúng thứ tự: cho nút mới trỏ tới nút đang đứng đầu, rồi dời head về nút mới; làm ngược thứ tự thì mất phần còn lại của danh sách. "

Lời giải
void push(Integer x) {
  Node p = new Node(x);
  p.next = head;
  head=p.next;
}

" gán head bằng p.next, mà p.next vừa được đặt bằng head, nên head không đổi và nút p bị bỏ rơi, giá trị mới không vào được ngăn xếp. "

Lời giải
void push(Integer x) {
  Node p = new Node(x);
  p.next = head;
}

" nối nút mới vào danh sách nhưng không bao giờ dời head, nên không ai chạm tới p được và kích thước ngăn xếp đứng yên. "

Lời giải
void push(Integer x) {
  Node p = new Node(x);
  p.next = null;
  head=p;
}

" cho head trỏ tới nút mới nhưng cắt p.next thành null, tức bỏ sạch mọi phần tử đã đẩy vào trước đó, ngăn xếp chỉ còn một phần tử.

Mở trang câu hỏi này →
Đề bài
Node q = p.next;
 p.next = q.next;
AIt deletes the node before p.
BIt deletes the node after p.
CIt deletes the node p.
DIt does not make any change on the list.
Lời giải
Đáp án đúng: "It deletes the node after p.". Hai dòng mã chỉ sửa một liên kết: q giữ tạm nút ngay sau p, rồi p.next được trỏ thẳng tới q.next, tức nút thứ hai sau p. Từ lúc đó không còn liên kết nào trong danh sách dẫn tới q, nên q bị tách khỏi chuỗi, đúng nghĩa xoá nút nằm sau p, và chi phí chỉ O(1) vì đã có p trong tay. "It deletes the node before p." không thể xảy ra: danh sách liên kết đơn chỉ có liên kết đi tiếp, từ p không truy được nút đứng trước, muốn xoá nút đó phải dò lại từ đầu danh sách. "It deletes the node p." sai vì muốn tách p thì nút đứng trước p phải trỏ tới p.next, mà đoạn mã không hề chạm tới nút trước p. "It does not make any change on the list." sai vì p.next đã bị gán lại, cấu trúc liên kết thay đổi thật.
Mở trang câu hỏi này →
Đề bài
while(S is not empty)

{ch = top element of the stack S if ch is isolated then remove it from the stack and put it to E

Đề bài
else

select the first vertex Y (by alphabet order), which is adjacent to ch,push Y to S and remove the edge (ch,Y) from the graph

Đề bài
}

the last array E obtained is an Euler cycle of the graph Suppose a multigraph G is given below (view picture). Which of the followings is the Euler cycle from the vertex B, created by above algorithm?

AB, A, D, C, B
BB, A, D, C, B, D, B
CB, D, C, B, D, A, B
DB, A, D, B, D, C, B
EB, C, D, B, D, A, B
Lời giải
Đáp án đúng: "B, D, C, B, D, A, B". Đồ thị có sáu cạnh A–B, B–C, C–D, A–D và hai cạnh song song B–D, mọi đỉnh bậc chẵn nên tồn tại chu trình Euler. Thuật toán luôn chọn đỉnh kề đầu tiên theo thứ tự chữ cái và chỉ ghi vào E khi đỉnh ở đỉnh ngăn xếp đã hết cạnh, nên E là dãy lấy ra, ngược với dãy đẩy vào. Từ B: đẩy A rồi xoá B–A; từ A đẩy D, xoá A–D; từ D đẩy B, xoá một cạnh B–D; từ B đẩy C, xoá B–C; từ C đẩy D, xoá C–D; từ D đẩy B, xoá cạnh B–D còn lại. Dãy đẩy vào là B, A, D, B, C, D, B, lần lượt lấy ra cho B, D, C, B, D, A, B. Vì vậy "B, A, D, C, B" sai vì chỉ dùng bốn cạnh, bỏ hẳn hai cạnh song song B–D; "B, A, D, C, B, D, B" dù là một chu trình Euler hợp lệ nhưng đòi ở D phải chọn C trước B, trái quy tắc chữ cái; "B, A, D, B, D, C, B" đòi ở B lần thứ hai chọn D trước C, cũng trái quy tắc; "B, C, D, B, D, A, B" đòi ngay bước đầu ở B chọn C khi A vẫn còn cạnh chưa dùng.
Mở trang câu hỏi này →
A35, 22, 39, 12, 28, 37, 27, 32
B35, 22, 39, 12, 32, 37, 28, 27
C35, 22, 39, 12, 32, 37, 27, 28
D35, 22, 39, 12, 37, 28, 27, 32
Lời giải
Đáp án đúng: "35, 22, 39, 12, 28, 37, 27, 32". Cây có gốc 35, nhánh trái 22 với hai con 12 và 32, dưới 32 là con trái 27, nhánh phải 39 với con trái 37. Khoá 28 đi từ 35 sang trái, từ 22 sang phải, từ 32 sang trái, từ 27 sang phải nên thành con phải của 27. Lúc đó nút 32 có nhánh trái cao 2 và nhánh phải rỗng, lệch 2, điểm chèn lại nằm ở nhánh phải của con trái nên là ca trái phải: quay 27 sang trái rồi quay 32 sang phải, kết quả 28 lên làm gốc đoạn với 27 bên trái và 32 bên phải. Duyệt theo chiều rộng cho 35, rồi 22 và 39, rồi 12, 28, 37, rồi 27 và 32. Dãy "35, 22, 39, 12, 32, 37, 27, 28" là trạng thái khi chưa quay, vẫn để 32 lệch 2 nên không còn là cây AVL. Dãy "35, 22, 39, 12, 32, 37, 28, 27" giữ 32 làm gốc đoạn và đặt 28 bên trái 27, phá thứ tự tìm kiếm vì 27 nhỏ hơn 28. Dãy "35, 22, 39, 12, 37, 28, 27, 32" xếp 37 trước 28 ở cùng mức, nhưng duyệt chiều rộng đọc nhánh trái trước nên 28 nằm dưới 22 phải đứng trước 37 nằm dưới 39.
Mở trang câu hỏi này →