You are on page 1of 16

ĐỀ CƯƠNG ÔN TẬP

Môn: CẤU TRÚC DỮ LIỆU & GIẢI THUẬT – CS316

A. LÝ THUYẾT
1. TRẮC NGHIỆM
1.1. GIẢI THUẬT VÀ ĐỆ QUY
1. (0.200 Point)
Nhân tố nào là nhân tố chính ảnh hưởng đến thời gian thực hiện của một giải thuật
A.Kích thước dữ liệu đầu vào
B. Máy tính
C. Thuật toán
D. Chương trình dịch
2. (0.200 Point)
Theo cách tiếp cận của lập trình có cấu trúc, NiklausWirth đưa ra công thức thể hiện được
mối liên hệ giữa cấu trúc dữ liệu và giải thuật như sau:
A. Thuật toán + dữ liệu đầu vào = chương trình
B. Thuật toán + cấu trúc dữ liệu = chương trình
C. Kỹ thuật lập trình + cấu trúc dữ liệu = Kết quả đầu ra.
D. Tất cả đều đúng
3. (0.200 Point)
Giải thuật là … câu lênh chặt chẽ, rõ ràng và xác định các thao tác trên các đối tượng dữ
liệu
A. Một
B. Hai
C. Nhiều
D.Dãy
4. (0.200 Point)
Kiểu dữ liệu trừu tượng là…...
A. Kiểu dữ liệu mà người lập trình phải tự xây dựng dựa trên các kiểu dữ liệu cơ bản được cung cấp từ
ngôn ngữ này.
B. Kiểu dữ liệu mà người lập trình phải tự xây dựng dựa trên kiểu dữ liệu không cơ bản được cung cấp từ
ngôn ngữ lập trình
C.Kiểu dữ liệu mà người lập trình phải tự xây dựng trên các kiểu dữ liệu cơ bản được cung cấp từ
ngôn ngữ lập trình
D. Kiểu dữ liệu mà người lập trình tự xây dựng không dựa trên kiểu dữ liệu cơ bản được cung cấp từ
ngôn ngữ lập trình
5. (0.200 Point)
Hàm đệ quy sau thực hiện công việc gì? int F(int n){if(n==0) return 1;return F(n-1) + F(n-
1) + F(n-1);}
A. 3n
B. n^3
C.3^n
D. 3n^2
6. (0.200 Point)
Cho hàm đê quy sau:int F(int n){if(n==0) return 1;return F(n-1) + F(n-1);}Vậy
A.F(5) = 32
B. F(5) = 10
C. F(5) = 25
1 | 16
D. F(5) = 5
7. (0.200 Point)
Chọn phát biểu đúng nhất
A. Một chương trình gọi là đệ quy nếu trong chương trình có lời gọi đến một chương trình đệ quy khác.
B. Một chương trình đệ quy là chương trình lặp đi lặp lại với số lần lặp không biết trước.
C.Một đối tượng được gọi là đệ quy nếu nó hoặc một phần của nó được định nghĩa thông qua khái
niệm về chính nó.
D. Một chương trình đề quy là chương trình có chưa hàm main.
8. (0.200 Point)
Đánh giá độ phức tạp của giải thuật là việc xác định ……và…… mà giải thuật cần
để thưc hiện giải một bài toán
A, Khoảng thời gian, độ khó
B. Khoảng thời gian, độ phức tạp
C. Khoảng thời gian, dung lượng bộ nhớ máy tính
D. Độ khó, dung lượng bộ nhớ máy tính
9. (0.2 point)
Các kiểu dữ liệu cơ bản là……
A. Các kiểu dữ liệu mà người lập trình được cung cấp sẵn từ máy tính
B. Các kiểu dữ liệu mà người lập trình được cung cấp sẵn từ ngôn ngữ tự nhiên
C. Các kiểu dữ liệu mà người lập trình được cung cấp sẵn từ ngôn ngữ lập trình
D. Các kiểu dữ liệu mà người lập trìn được cung cấp sẵn từ ngôn ngữ này
10. (0.2 point)
Chỉ ra kiểu dữ liệu cơ bản:
A. Sinh viên
B. float
C. Hoten
D. Ngày sinh
1.2. DANH SÁCH ĐẶC (MẢNG)
1. (0.200 Point)
Cài đặt danh sách bằng mảng có nghiã là
A. Dùng bản ghi có hai thành phần để lưu trữ các phần tử của danh sách
B. Dùng biến con trỏ lưu trữ các phần tử của danh sách.
C. Tất cả đều đúng.
D. Dùng một mảng (array) để lưu trữ liên tiếp các phần tử của danh sách bắt đầu từ vị trí đầu tiên
của mảng.
2. (0.200 Point)
Tư tưởng của giải thuật tìm kiếm nhị phân:
A. So sánh X lần lượt với các phần tử thứ nhất, thứ hai,… của dãy cho đến khi gặp phần tử có khoá cần
tìm.
B. Lần lượt chia dãy thành hai dãy con dựa vào phần tử khoá, sau đó thực hiện việc tìm kiếm trên hai
đoạn đã chia.
C. Tại mỗi bước tiến hành so sánh X với phần tử ở giữa của dãy, dựa vào bước so sánh này quyết
định giới hạn dãy tìm kiếm nằm ở nửa trên, hay nửa dưới của dãy hiện hành.
D. Tìm kiếm dựa vào cây nhị tìm kiếm.n
3. (0.200 Point)
Tư tưởng của giải thuật tìm kiếm tuần tự
2 | 16
A. So sánh X lần lượt với các phần tử thứ nhất, thứ hai,... của dãy cho đến khi gặp phần tử có khoá
cần tìm.
B. Tìm kiếm dựa vào cây nhị tìm kiếm: Nếu giá trị cần tìm nhỏ hơn gốc thì thực hiện tìm kiếm trên cây
con trái, ngược lại ta việc tìm kiếm được thực hiện trên cây con phải.
C. Tại mỗi bước tiến hành so sánh X với phần tử ở giữa của dãy, Dựa vào bước so sánh này quyết định
giới hạn dãy tìm kiếm nằm ở nửa trên, hay nửa dưới của dãy hiện hành.
D. Lần lượt chia dãy thành hai dãy con dựa vào phần tử khoá, sau đó thực hiện việc tìm kiếm trên hai
đoạn đã chia.
4. (0.200 Point)
Danh sách Đặc là:
A. Một tập hợp mà không cần khai báo trước số lượng phần tử khi sử dụng
B. Một tập hợp có thứ tự gồm một số xác định n phần tử cùng kiểu dữ liệu liên tục trong bộ nhớ và
có cùng một tên (với n được gọi là độ dài hay kích thước của mảng).
C. Một các phần từ được xác định trước, có cùng kiểu dữ liệu và nằm rài rác trong vùng nhớ
D. Một tập các hợp phần tử có cùng kiểu dữ liệu và được sắp xếp theo thứ tự tăng dần.
5. (0.200 Point)
Ý tưởng phương pháp sắp xếp nổi bọt (bubble sort) là:
A. Phân đoạn dãy thành nhiều dãy con và lần lượt trộn hai dãy con thành dãy lớn hơn, cho đến khi
thu được dãy ban đầu đã được sắp xếp.
B. Chọn phần tử bé nhất xếp vào vị trí thứ nhất bằng cách đổi chổ phần tử bé nhất với phần tử thứ nhấ;
Tương tự đối với phần tử nhỏ thứ hai, ba...
C. Lần lượt lấy phần tử của danh sách chèn vị trí thích hợp của nó trong dãy bằng cách đẩy các phần tử
lớn hơn xuống.
D.Bắt đầu từ cuối dãy đến đầu dãy, ta lần lượt so sánh hai phần tử kế tiếp nhau, nếu phần tử nào nhỏ hơn
được đứng vị trí trên.
7. (0.200 Point)
Ý tưởng phương pháp sắp xếp nhanh (Quick sort) là:
A. Lần lượt chia dãy phần tử thành hai dãy con bởi một phần tử khoá (dãy con trước khoá gồm các
phần tử nhỏ hơn khoá và dãy còn lại gồm các phần tử lớn hơn khoá).
B. Chọn phần tử bé nhất xếp vào vị trí thứ nhất bằng cách đổi chổ phần tử bé nhất với phần tử thứ nhất;
Tương tự đối với phần tử nhỏ thứ hai, ba...
C. Phân đoạn dãy thành nhiều dãy con và lần lượt trộn hai dãy con thành dãy lớn hơn, cho đến khi thu
được dãy ban đầu đã được sắp xếp.
D. Bắt đầu từ cuối dãy đến đầu dãy, ta lần lượt so sánh hai phần tử kế tiếp nhau, nếu phần tử nào nhỏ hơn
được đứng vị trí trên.
8. (0.200 Point)
Trong các giải thuật sắp xếp, giải thuật nào áp dụng phương pháp "Chia để trị"?
A. Quick sort, Bubble sort
B. Qucick sort, Insert sort
C.Quick sort, Merge sort
D. Quick sort, Heap sort
9. (0.200 Point)
Cho dãy số {6 1 3 0 5 7 9 2 8 4}. Áp dụng phương pháp sắp xếp lựa chọn (Select sort) sau
lần lặp đầu tiên của giải thuật ta có kết quả: {0 1 3 6 5 7 9 2 8 4}. Dãy số thu được sau lần
lặp thứ năm là:
A. {0 1 2 3 5 7 9 4 8 6}
B. {0 1 2 3 6 5 7 9 8 4}
C. {0 1 2 3 4 7 9 6 8 5}
D. {0 1 2 3 4 5 6 7 8 9}

3 | 16
10. (0.200 Point)
Trong thuật toán sắp xếp nổi bọt kết thúc khi nào?
A. Khi các phần tử đã nằm đúng thứ tự mong muốn.
B. Không còn bất kì cặp liền kề trái thứ tự mong muốn
C. Không còn xảy ra đổi chỗ lần nào nữa
D. Cả A, B và C đều đúng

1.3. DANH SÁCH LIÊN KẾT


1. (0.200 Point)
Định nghĩa đúng nhất về danh sách liên kết
A. Danh sách liên kết là tập hợp các phần từ mà giữa chúng có sự nối kết với nhau thông qua vùng
liên kết của chúng
B. Danh sách liên kế là cấu trúc dữ liệu dạng cây
C. Danh sách liên kết là cấu trúc dữ liệu tự định nghĩa
D. Danh sách liên kết là tập hợp các phần từ liên tục trong vùng nhớ
2. (0.200 Point)
Dấu hiệu nào dưới đây cho biết danh sách liên kết đơn rỗng:
A. (p->right==NULL);
B. (p->info==NULL);
C. (p==NULL);
D. (p->next==NULL);
4. (0.200 Point)
Chọn câu nói đúng nhất về danh sách liên kết đôi
A. Vùng liên kết của 1 phần từ trong danh sách liên kết có 2 mối liên kết với 2 phần tử trước và sau
nó trong danh sách
B. Vùng liên kết của 1 phần từ trong danh sách liên kết có 2 mối liên kết với 1 phần tử khác
C. Vùng liên kết của 1 phần từ trong danh sách liên kết có 1 mối liên kết với 2 phần tử khác
D. Vùng liên kết của 1 phần từ trong danh sách liên kết có 2 mối liên kết với 2 phần tử khác trong danh
sách
5. (0.200 Point)
Định nghĩa cấu trúc dữ liệu dạng danh sách(LIST)
A. danh sách là kiểu con trỏ
B. danh sách là tập hợp các phần tử khác kiểu
C. danh sách là kiểu dữ liệu mảng
D. danh sách là một tập hợp các phần tử có cùng một kiểu mà ta gọi là kiểu phần tử
(ElementType).
6. (0.200 Point)
Dấu hiệu nào dưới đây cho biết node p của một danh sách liên kết đơn là node cuối cùng
bên phải:
A. (p->info!=NULL);
B. (p->info==NULL);
C. (p->next!=NULL);
D. (p->next==NULL);
7. (0.200 Point)
Cho p trỏ vào nút giữa của một DSLK đôi trỏ bởi con trỏ đầu pHead và con trỏ cuối pTail, danh
sách chỉ gồm 3 nút. Để tách p ra khỏi danh sách mà danh sách vẫn nối đúng. Thực thiện những câu
lệnh nào sau đây.
A. p->Next->Pre=p->Next; p->Pre->Next=p->Pre.
B. p->Pre->Next=p->Pre; p->Next->Pre=p->Next

4 | 16
C. pHead->Next=pTail; pTail->Pre=pHead;
D. Tất cả đều đúng.
8. (0.200 Point)
Để xóa con trỏ p đang trỏ vào một nút không phải là vị trí đầu trong danh sách liên kết đơn có
nhiều hơn một nút. Ta cần xác định con trỏ q trỏ vào vị trí nào sau dây:
A. Trỏ vào vị trí đầu danh sách.
B. Trỏ vào vị trí cuối danh sách.
C. Trỏ vào nút bên trái của p và gần p nhất.
D. Trỏ vào nút bên phải của p và gần p nhất.
9. (0.200 Point)
Để nối 1 node vào danh sách liên kết đơn thì các câu lệnh cần thực hiện là gì?
A. q = (listnode) malloc(sizeof(struct node)); q->item = x; q->next=*p;
B. q->next=*p; q = (listnode) malloc(sizeof(struct node)); q->item = x;
C. q = (listnode) malloc(sizeof(struct node)); q->next=*p; q->item = x;
D. q->item = x;
10. (0.200 Point)
Phát biểu nào sau đây là đúng
A. Mỗi nút trong DSLK đơn chứa thành phần kết nối và một số nguyên hoặc dữ liệu của nút đó
B. Thành phần kết nối của một nút trong DSLK đơn luôn chứa địa chỉ của nút kết tiếp.
C. Trong DSLK đơn nối vòng thành phần kết nối của mỗi nút luôn trỏ vào nó.
D. Mỗi nút trong DSLK đôi chứa hai thành phần kết nối và thành phần dữ liệu.

1.4. STACK VÀ QUEUE


1. (0.200 Point)
Cơ chế nào dưới đây được cài đặt cho Stack:
A. LIFO
B. Tuần tự
C. Round Robin
D. FIFO
2. (0.200 Point)
Định nghĩa cấu trúc dữ liệu Stack:
A. Stack là danh sách kết nối.
B. Stack là một danh sách đặc biệt mà phép thêm vào được thực hiện ở một đầu, và phép loại bỏ được
thực hiện ở phần kia của stack.
C. Stack là một danh sách đặc biệt mà phép thêm vào hoặc loại bỏ một phần tử chỉ thực hiện tại
một đầu gọi là đỉnh (Top) của Stack.
D. Stack là cấu trúc dữ liệu được cài đặt bằng con trỏ.
3. (0.200 Point)
Trong việc xây dựng các hàm cho danh sách hạn chế hàm sau viết ra để làm gì bool
FunctionEmpty(Queue pHead){return (pHead==NULL);}
A. Khởi tạo hàng đợi rỗng
B. Khởi tạo ngăn xếp rỗng
C. Kiểm tra ngăn xếp hoặc hàng đợi đầy
D. Kiểm tra hàng đợi hoặc ngăn xếp rỗng.
4. (0.200 Point)
Cơ chế nào dưới đây được cài đặt cho hàng đợi:
A. FIFO
B. Round Robin
C. Tuần tự

5 | 16
D. FILO
5. (0.200 Point)
Cho biểu thức sau: A + B – C * D + F thì biểu thức hậu tố là:
A. AB+CD*-F+
B. AB+CD-*F+
C. ABCD+*-F+
D. AB+CDF*-+
6. (0.200 Point)
Cho biểu thức trung tố sau P=a*(b+c), biểu thức nào sau đây là biểu thức hậu tố P
A. ab+c*
B. a*bc+
C. ab*c+
D.abc+*
7. (0.200 Point)
Để cài đặt Stack ta có thể dùng phương pháp nào sau đây:
A. Bằng con trỏ
B. Bằng mảng
*C. Bằng con trỏ và bằng mảng
D. Các phương án khác đều sai
8. (0.200 Point)
Tính chất của hàng đợi
A. Vào trước - ra trước" - FIFO: First In First Out.
B. Vào sau - ra trước" - LIFO: Last In Fist Out.
C. Vào trước - ra sau" - FILO: First In last Out.
D. Các phương án khác đều sai
9. (0.200 Point)
Chọn định nghĩa đúng nhât về hàng đợi (Queue)
A. Hàng đợi là 1 danh sách, trong đó việc thêm và bớt phần tử được thực hiện ở 2 đầu khác nhau
B. Hàng đợi là 1 danh sách, trong đó việc thêm và bớt phần tử được thực hiện ở cùng 1 đầu
C. Hàng đợi là 1 danh sách liên kết đơn
D. Hàng đợi là 1 danh sách họat động theo cơ chế FILO(First In Last Out)
10. (0.200 Point)
Cho biểu thức tiền tố sau P=(a+b)^2+c, biểu thức hậu tố (Q) nào sau đây là kết quả của
biểu thức P.
A. ab+2^c+
B. ab2+^c+
C. ab+2^+c
D. ab+2c^+

1.5. CÂY
1. (0.200 Point)
Một cây nhị phân được gọi là đúng nếu:
A. Node gốc và tất cả các node trung gian đều có 2 node con
B. Giá trị khóa của node gốc bao giờ cũng lớn hơn giá trị các khóa của nhánh cây con bên phải
C. Giá trị khóa của node gốc bao giờ cũng lớn hơn giá trị các khóa của nhánh cây con bên trái
D. Node gốc và các node trung gian đều có 2 node con và các node lá đều có mức giống nhau
2. (0.200 Point)
Chọn định nghĩa đúng nhất về cây nhị phân tìm kiếm (BST: Binary Search Tree)

6 | 16
A.BST là cây mà với mọi nút không phải là Lá có giá trị lớn hơn mọi giá trị của các nút trên cây
con trái và nhỏ hơn mọi giá trị của các nút trên cây con phải
B. BST là cây mà với mọi nút không phải là Lá có giá trị lớn hơn giá trị của nút trên cây con trái và nhỏ
hơn giá trị của nút con phải
C. BST là cây mà với mọi nút không phải là Lá có giá trị lớn hơn mọi giá trị của các nút trên cây con phải
và nhỏ hơn mọi giá trị của các nút trên cây con trái
D. BST là cây nhị phân mà giá trị các nút trên cây khác nhau từng đôi một
3. (0.200 Point)
Chọn phát biểu đúng
A. Cây nhị phân là cây phải có hai nhánh con
B. Cây nhị phân là cây mà các cây con của nó phải có hai nút
C.Cây nhị phân là cây mà mọi nút trên cây chỉ có tối đa hai nhánh con
D. Tất cả đều đúng
4. (0.200 Point)
Một cây nhị phân được gọi là đúng nếu:
A. Node gốc và các node trung gian đều có 2 node con và các node lá đều có mức giống nhau
B. Giá trị khóa của node gốc bao giờ cũng lớn hơn giá trị các khóa của nhánh cây con bên trái
C. Giá trị khóa của node gốc bao giờ cũng lớn hơn giá trị các khóa của nhánh cây con bên phải
D.Node gốc và tất cả các node trung gian đều có tối đa 2 node con
5. (0.200 Point)
Chiều cao của cây là gì?
A. Cấp lớn nhất của nút
B. Mức lớn nhất của cây
C. Số cây con của cây
D. Số lượng nút của cây
6. (0.200 Point)
Cây nhị phân đầy đủ là?
A. Là cây nhị phân mà nút gốc và các nút con có tối đa hai cây con.
B. Là cây nhị phân mà nút gốc và tất cả các node trung gian có đúng hai node con.
C. Là cây nhị phân mà nút gốc có đúng hai cây con.
D. Là cây nhị phân mà tất cả các nút trung gian có đúng hai node con.
7. (0.200 Point)
Cây nhị phân tìm kiếm là:
A. Cây rỗng.
B. Cây có một nút gốc
C. Với mọi Node: Node có tối đa hai cây con. Nội dung node cha lớn hơn nội dung node con bên trái
và nhỏ hơn nội dung node con bên phải.
D.Tất cả đêu đúng
8. (0.200 Point)
Chọn phát biểu đúng
A. Cây nhị phân là cây phải có hai nhánh con
B. Cây nhị phân là cây mà các cây con của nó phải có hai nút
C.Cây nhị phân là cây mà mọi nút trên cây chỉ có tối đa hai nhánh con
D. Tất cả đều đúng
9. (0.200 Point)
Cây nhị phân cân bằng (AVL Tree) là:
A. Là cây nhị phân có số node thuộc nhánh cây con trái và số node thuộc nhánh cây con phải cân bằng
nhau

7 | 16
B. Cây nhị phân có số node thuộc nhánh cây con trái và số node thuộc nhánh cây con phải chênh
lệch nhau không quá 1.
C. Cây nhị phân có số node thuộc nhánh cây con trái và số node thuộc nhánh cây con phải không được
chênh lệch nhau.
D. Là cây nhị phân mà nút gốc và tất cả các node trung gian có đúng hai node con.
10. (0.200 Point)
Cho cây bên dưới, cho biết kết quả duyệt cây theo thứ tự trước (NLR)

A. 40, 30, 25, 20, 28, 35, 32, 38, 60, 50, 70, 65, 90
B. 20, 25, 28, 30, 32, 35, 38, 40, 50, 60, 65, 70, 90
C. 20, 28, 25, 32, 38, 35, 30, 50, 65, 90, 70, 60, 40
D. 40, 30, 25, 20, 28, 35, 32, 38, 60, 90, 65, 70, 50
11. (0.2 Point)
Cho cây bên dưới. Nếu ta muốn xóa nút mang số 30 thì giá trị của nút nào có chọn thế mạng là….

A. 20 hoặc số 28
B. 35 hoặc 25
C. 28 hoặc 32
D. 20 hoặc 38
12. (0.2 Point)
Cho cây bên dưới. Nếu ta muốn xóa nút mang số 40 thì giá trị của nút nào có chọn thế mạng.

A. 20
B. 35
C. 38
D. 65
13. (0.2 Point)
8 | 16
Cho cây biểu thức sau. Duyệt cây theo thứ tự trước (NLR) ta được biểu thức nào sau đây:

A. - * + a b c /d e
B. a b + c * d e / -
C. - * a+ b c d/ e
D. + a b - * c /d e
14. (0.2 Point)
Cho cây biểu thức sau. Duyệt cây theo thứ tự giữa (LNR) ta được biểu thức nào sau đây:

A. (a + b)* c – d/e
B. a b + c * d e / -
C. (a + b) * d – c/e
D. + a b - * c /d e
15. (0.2 Point)
Cho cây biểu thức sau. Duyệt cây theo thứ tự sau (LRN) ta được biểu thức nào sau đây:

9 | 16
A. a b + c * d e / -
B. a b + dc * e- /
C. (a + b) * d – c/e
D. + a b - * c /d e

CÂU HỎI NGẮN


1. (0.300 Point)
Thuật toán là gì? Nêu khái niệm.
2. (0.300 Point)
Cấu trúc dữ liệu là gì? Nêu định nghĩa
3. (0.300 Point)
Khai báo cấu trúc của một nút trên danh sách liên kết đơn chứa một giá trị nguyên
struct Node {
int value; // Giá trị nguyên được lưu trữ trong nút
Node* next; // Con trỏ trỏ đến nút tiếp theo trong danh sách
};
4. (0.300 Point)
Cho biết trước kết quả của ba phép duyệt cây nhị phân tìm kiếm như sau:
Duyệt tiền tự:14 13 12 11 17 16
Duyệt trung tự:11 12 13 14 16 17
Duyệt hậu tự:11 12 13 16 17 14
Hãy cho biết các node lá của cây
11 và 16
5. (0.300 Point)
Cho biểu trung tố như sau: a*((b + 3) +5)* (4 – 7) + b – 9. Hãy cho biết kết quả sau khi
chuyển sang biểu thức hậu tố
ab3+5+*47-*b+9-
6. (0.300 Point)
Bạn hãy nêu một ứng dụng cụ thể của cây nhị phân trong thực tế. Hãy giải thích tại sao
bạn nghĩ vậy?
7. (0.300 Point)
Cây nhị phân tìm kiếm T là một cây hoàn chỉnh chứa 1000000 node. Giả sử muốn tìm một
khóa nào đó trên cây, thì thuật toán phải thực hiện tối đa bao nhiêu lần.

10 | 16
20 lần
8. (0.300 Point)
Có thể chuyển cây n phân (n > 2) sang cây nhị phân được không? Nếu được nêu ý tưởng.
9. (0.300 Point)
Cây nhị phân là gì? Nêu định nghĩa.
10. (0.300 Point)
Cho dãy (khác rỗng) các số nguyên A = (a1, a2,…, an) với điều kiện nào của các phần tử
trên A để có thể thực hiện được việc tìm kiếm nhị phân
- dãy số này phải được sắp xếp theo thứ tự tăng dần hoặc giảm dần.
11. (0.300 Point)
12. (0.500 Point)
Cho biểu thức trung tố A * B + C - ( D – E )^ (20 + H) / 10. Hãy tìm biểu thức hậu tố tương
ứng
-A B * C + D E - 20 H + ^ 10 / -
13. (0.500 Point)
Cho biểu thức trung tố A * B + C - ( D – E )^ (20 + H) / 10. Hãy tìm biểu thức tiền tố tương
ứng
- - + * A B C / ^ - D E + 20 H 10
14. (0.500 Point)
Cấu trúc của 1 node trên cây là struct Cay{int duLieu; Cay *trai, *phai;};
Cho thuật toán F(x, t) chèn giá trị x vào cây t như sau: void F(int x, Cay *&t){ if(t==NULL)
{ t = new Cay; t->duLieu = x; t->trai = t->phai = NULL; } else if(t->duLieu >x) F(x,t->trai);
else F(x, t->phai); } Hãy vẽ cây t sau khi lần lượt lấy từng giá trị chèn vào cây t.\
10
/ \
5 15
/\ /\
3 7 13 17
15. (0.500 Point)
1.Cho dãy số {3, 5, 6, 9, 10, 12, 15, 19, 25 } được lưu trữ trong mảng A(chỉ số đi từ 1)Và cho
thuật toán đệ quy tìm nhị phân như sau:int Find(int a[], int x, int L, int R){if(L>R) return
0;int mid = (L+R)/2;if(x==a[mid]) return mid;if(x<a[mid]) return Find(a,x, L, mid-1);else
return Fid(a,x,mid+1, R);} Hãy nêu quá trình thực hiện hàm F khi gọi Find(A,6,1,9);
16. (0.500 Point)
Cho danh sách liên kết đơn, có con trỏ L trỏ vào đầu danh sách; Node của danh sách được
định nghĩa như sau: struct Node {int info; Node *link;};, Viết hàm đệ quy tính tổng các giá
trị chẵn trong danh sách.
17. (0.500 Point)
Cho biểu thức trung tố A * B + C - ( D – E )^ (20 + H) / 10. Hãy vẽ cây toán học tương ứng
-
/\
+ /
/\/\
* C ^
/\ /\
A B - 10
/\
11 | 16
D E
\
+
/\
20 H
18. (0.500 Point)
Cho biểu thức hậu tố A B C + - D E * F + / . Hãy tìm biểu thức trung tố tương ứng
A - (B + C) / ((D * E) + F)
19. (0.500 Point)
20. Cho dãy số : 10 15 7 11 2 13 8 15 21 2 6 và cây t rỗng.Cho thuật toán F(x, t) chèn giá trị
x vào cây t như sau:void F(int x, Cay *&t){if(t==NULL) {t = new Cay;t->duLieu = x;t->trai
= t->phai = NULL;}else if(t->duLieu >=x) F(x,t->trai);else F(x, t->phai);}Hãy vẽ cây t sau
khi lần lượt lấy từng giá trị chèn vào cây t.
10
/ \
7 15
/\ / \
2 8 11 21
/ \ /
2 6 15
/
13
21. (0.500 Point)
Cho dãy số : 10 15 7 11 2 13 8 15 21 2 6 và cây t rỗng. Cấu trúc của 1 node trên cây là struct
Cay{int duLieu; Cay *trai, *phai;};Giả sử có hàm int demNode(Cay *t) để đếm số node
trên cây tCho thuật toán F(x, t) chèn giá trị x vào cây t như sau:void F(int x, Cay *&t)
{if(t==NULL) {t = new Cay;t->duLieu = x;t->trai = t->phai = NULL;}else if(demNode(t-
>trai)phai)) F(x, t->trai);else F(x, t->phai);}Hãy vẽ cây t sau khi lần lượt lấy từng giá trị
chèn vào cây t.
22. (0.500 Point)
Cho danh sách liên kết đơn, có con trỏ L trỏ vào đầu danh sách; Node của danh sách được
định nghĩa như sau: struct Node {int info; Node *link;};, Viết hàm đệ quy tính tổng các giá
trị chẵn trong danh sách.
int sumEven(Node* L) {
if (L == NULL) {
return 0;
} else {
if (L->info % 2 == 0) {
return L->info + sumEven(L->link);
} else {
return sumEven(L->link);
}
}
}

B. BÀI TẬP
1. (3.0 points) Giả sử đã tồn tại một danh sách liên kết đơn được trỏ bởi L như hình dưới.
12 | 16
a. Viết thuật toán chèn một phần tử có giá trị y vào vị trí bất kỳ (đầu, cuối, giữa) trên danh
sách.
b. Viết thuật toán tìm một phần tử có giá trị x, nếu x có trên danh sách thì trả về địa chỉ
node đầu tiên chứa giá trị x, nếu x không tồn tại trên danh sách thì trả về giá trị NULL.
c. Cho biểu trung tố như sau: 8*((2 + 3) +5)* (4 – 7) + 2 – 9. Sử dụng cơ chế stack để
chuyển biểu thức trung tố trên sang biểu thức hậu tố.
2. Dãy khóa bên dưới là thứ tự tạo ra cây nhị phân tìm kiếm: 4 10 6 3 9 12 2.
Vẽ cây sau khi xóa node gốc.
4
/\
3 10
/ / \
2 6 12
\
9
3
/\
2 10
/ \
6 12
\
9
3
/\
2 10
/ \
6 12
\
9
3. (0.500 Point)
Cho danh sách liên kết đơn, có con trỏ L trỏ vào đầu danh sách; Node của danh sách được
định nghĩa như sau: struct Node {int info; Node *link;};, Viết hàm đệ quy xuất giá trị node
cuối của danh sách
int getLastNodeValue(Node* L) {
if (L == NULL) {
// Danh sách rỗng, không có giá trị để trả về.
// Bạn có thể thay đổi cách xử lý này tùy thuộc vào yêu cầu cụ thể của bạn.
return -1;
} else if (L->link == NULL) {
// Đây là node cuối cùng trong danh sách.
return L->info;
} else {

13 | 16
// Tiếp tục tìm kiếm ở phần còn lại của danh sách.
return getLastNodeValue(L->link);
}
}
4. (3.000 Points)
Giả sử có danh sách liên kết đơn được trỏ bới con trỏ L; Mỗi nút trên danh sách được tổ
chức như sau: struct Nut{ int duLieu; Nut *tiep; };
1.Viết hàm int Max (Nut *L) để tìm giá trị lớn nhất trong danh sách
int Max(Nut* L) {
if (L == NULL) {
// Danh sách rỗng, không có giá trị để trả về.
// Bạn có thể thay đổi cách xử lý này tùy thuộc vào yêu cầu cụ thể của bạn.
return -1;
} else {
int max_value = L->duLieu;
Nut* current = L->tiep;
while (current != NULL) {
if (current->duLieu > max_value) {
max_value = current->duLieu;
}
current = current->tiep;
}
return max_value;
}
}

2.Viết 2 hàm void XoaCuoi(nut *&L) để xóa nút cuối trong danh sách (Vòng lặp, đệ quy)
Vòng lặp
void XoaCuoi(nut*& L) {
if (L == NULL) {
return;
} else if (L->link == NULL) {
delete L;
L = NULL;
} else {
nut* current = L;
while (current->link->link != NULL) {
current = current->link;
}
delete current->link;
current->link = NULL;
}
}
Đệ quy
void XoaCuoi(nut*& L) {

14 | 16
if (L == NULL) {
return;
} else if (L->link == NULL) {
delete L;
L = NULL;
} else {
XoaCuoi(L->link);
}
}
5. Giả sử có cây nhị phân được trỏ bới con trỏ t; Mỗi nút trên cây được tổ chức như sau:
struct Cay{ int duLieu; Cay *trai, *phai; };
1.Viết hàm int TimMax(Cay *t) để tìm giá trị lớn nhất trên cây
int TimMax(Cay* t) {
if (t == NULL) {
// Cây rỗng, không có giá trị để trả về.
// Bạn có thể thay đổi cách xử lý này tùy thuộc vào yêu cầu cụ thể của bạn.
return INT_MIN;
} else {
int max = t->duLieu;
int left_max = TimMax(t->trai);
int right_max = TimMax(t->phai);
if (left_max > max) max = left_max;
if (right_max > max) max = right_max;
return max;
}
}
2.Viết 2 hàm int Cao (Cay *t) để tính chiều cao của cây (Vòng lặp & Đệ quy)
int Cao(Cay* t) {
if (t == NULL) {
return 0;
} else {
int left_height = Cao(t->trai);
int right_height = Cao(t->phai);
return max(left_height, right_height) + 1;
}
}
6. (0.500 Point)
Cho danh sách liên kết đơn, có con trỏ L trỏ vào đầu danh sách; Node của danh sách được
định nghĩa như sau: struct Node {int info; Node *link;}. Viết hàm đệ quy xóa node được trỏ
bỏi con trỏ p trong danh sách.
void XoaNode(Node*& L, Node* p) {
if (L == NULL || p == NULL) {
return;
} else if (L == p) {
Node* temp = L;
L = L->link;

15 | 16
delete temp;
} else {
XoaNode(L->link, p);
}
}
7. (3.000 Points)
Giả sử có danh sách liên kết đơn được trỏ bới con trỏ L; Mỗi nút trên danh sách được tổ
chức như sau: struct Nut{ int duLieu; Nut *tiep; };
1. Viết hàm int MaxLT(Nut *L) để tìm tổng lớn nhất của giá trị liên tiếp trong danh sách
2. Viết 2 hàm void ThemCuoi(nut *&L, int x) để thêm x vào cuối danh sách (Vòng lặp, đệ
quy)
void ThemCuoi(Nut*& L, int x) {
if (L == NULL) {
L = new Nut;
L->duLieu = x;
L->tiep = NULL;
} else {
ThemCuoi(L->tiep, x);
}
}
8. Giả sử có cây nhị phân tìm kiếm được trỏ bới con trỏ t; Mỗi nút trên cây được tổ chức
như sau: struct Cay{ int duLieu; Cay *trai, *phai; };
1. Hãy viết 2 hàm int TimMax(Cay *t) để tìm giá trị lớn nhất trên cây (Sử dụng vòng lặp,
đệ quy)
2. Hãy viết hàm liệt kê các giá trị theo thứ tự giảm dần
void LietKeGiamDan(Cay* t) {
if (t != NULL) {
LietKeGiamDan(t->phai);
cout << t->duLieu << " ";
LietKeGiamDan(t->trai);
}
}

---o0o---

16 | 16

You might also like