-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmock-test-04.cpp
238 lines (208 loc) · 6.14 KB
/
mock-test-04.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TNode {
int key;
struct TNode *left, *right;
} TN;
// tao nut moi
TN* makeNewNode(int key)
{
TN* newNode = (TN*)malloc(sizeof(TN));
newNode->left = newNode->right = NULL;
newNode->key = key;
return newNode;
}
// then nut moi vao cay
// root la nut cha va nNode la nut moi them
// tham so rtype = L --> them vao con trai va R thi them vao con phai
void addNodeToTree(TN* root, TN* nNode, char rtype)
{
if (rtype == 'L')
root->left = nNode;
else
root->right = nNode;
}
// duyet cay theo thu tu giua
void inOrderTravel(const TN* root)
{
if (NULL == root)
return;
inOrderTravel(root->left);
printf("%d ", root->key);
inOrderTravel(root->right);
}
void printInOrderTravel(const TN* root)
{
inOrderTravel(root);
printf("\n");
}
TN* buildTree()
{
TN *root = NULL, *nNode, *parent;
int level, i, key;
char path[20], nextLine[100];
while (1) {
fgets(nextLine, sizeof(nextLine), stdin);
nextLine[strcspn(nextLine, "\r\n")] = 0;
if (strstr(nextLine, "-1") != NULL)
break;
sscanf(nextLine, "%d %s %d", &level, path, &key);
if (level == 0) {
root = makeNewNode(key);
continue;
}
// add decendent nodes
nNode = makeNewNode(key);
parent = root;
for (i = 0; i < strlen(path) - 1; i++)
if (path[i] == 'R')
parent = parent->right;
else
parent = parent->left;
addNodeToTree(parent, nNode, path[i]);
}
return root;
}
/*
==========================================
Phần viết code của sinh viên
===========================================
*/
int hasDuplicateItemHelper(const TN* node, int values[])
{
if (node == NULL)
return 0;
if (values[node->key] == 1)
return 1;
values[node->key] = 1;
return hasDuplicateItemHelper(node->left, values) || hasDuplicateItemHelper(node->right, values);
}
// Tìm lá nhỏ nhất trên cây
TN* smallestLeaf(TN* root)
{
if (root == NULL)
return NULL;
if (root->left == NULL && root->right == NULL)
return root;
TN* leftSmallest = smallestLeaf(root->left);
TN* rightSmallest = smallestLeaf(root->right);
if (leftSmallest == NULL)
return rightSmallest;
if (rightSmallest == NULL)
return leftSmallest;
return leftSmallest->key < rightSmallest->key ? leftSmallest : rightSmallest;
}
// Lưu trữ giá trị cây theo thứ tự trung tố vào mảng
void storeInOrder(const TN* node, int arr[], int* n)
{
if (node == NULL)
return;
storeInOrder(node->left, arr, n);
arr[(*n)++] = node->key;
storeInOrder(node->right, arr, n);
}
// Kiểm tra xem cây có phần tử trùng lặp không
int hasDuplicateItem(const TN* root)
{
// Sử dụng một mảng để lưu trữ giá trị đã xuất hiện
int values[1000] = { 0 }; // Chú ý: Điều này giới hạn độ sâu của cây
return hasDuplicateItemHelper(root, values);
}
// Đếm số lượng nút đặc biệt trên cây
int countSpecialNodes(const TN* root, int k)
{
if (root == NULL)
return 0;
int count = 0;
// Nếu giá trị của nút lớn hơn hoặc bằng k, tăng biến đếm lên 1
if (root->key >= k)
count++;
// Đệ quy vào cây con trái và cây con phải để đếm các nút đặc biệt
count += countSpecialNodes(root->left, k);
count += countSpecialNodes(root->right, k);
return count;
}
// Hàm so sánh để sử dụng với qsort
int compare(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}
// Chuyển đổi mảng giá trị đã sắp xếp thành BST
void convertToBST(TN* node, int arr[], int* n)
{
if (node == NULL)
return;
convertToBST(node->left, arr, n);
node->key = arr[(*n)++];
convertToBST(node->right, arr, n);
}
// Chuyển đổi cây thành một cây nhị phân tìm kiếm
void convertToBinarySearchTree(TN* root)
{
int* arr = (int*)malloc(sizeof(int) * 1000); // Điều này giới hạn số lượng nút của cây
int n = 0;
storeInOrder(root, arr, &n);
qsort(arr, n, sizeof(int), compare); // Sắp xếp mảng giá trị cây
n = 0;
convertToBST(root, arr, &n);
free(arr);
}
/*
=====================================
Hết phần viết code
===============================
*/
void checkDuplicateItemonTree(TN* root)
{
if (hasDuplicateItem(root))
printf("Tree has some duplicate items!\n");
else
printf("There is no dulplicate item on the tree!\n");
}
void countListSpecialNodes(const TN* root)
{
char nextLine[100];
int k;
while (1) {
fgets(nextLine, sizeof(nextLine), stdin);
nextLine[strcspn(nextLine, "\r\n")] = 0;
if (strstr(nextLine, "-1") != NULL)
break;
sscanf(nextLine, "%d", &k);
printf("Total special nodes >=%d: %d\n", k, countSpecialNodes(root, k));
}
}
void printSmallestLeaf(TN* root)
{
TN* smLeaf = smallestLeaf(root);
if (smLeaf != NULL)
printf("Smallest Leaf : %d\n", smLeaf->key);
else
printf("There is no leaf on the tree!\n");
}
int main()
{
TN* root = NULL;
char nextCommand[100];
while (1) {
fgets(nextCommand, sizeof(nextCommand), stdin);
nextCommand[strcspn(nextCommand, "\r\n")] = 0;
if (nextCommand[0] != '?')
break;
if (strcmp(&nextCommand[2], "buildTree") == 0)
root = buildTree();
else if (strcmp(&nextCommand[2], "printInOrderTravel") == 0)
printInOrderTravel(root);
else if (strcmp(&nextCommand[2], "countSpecialNodes") == 0)
countListSpecialNodes(root);
else if (strcmp(&nextCommand[2], "printSmallestLeaf") == 0)
printSmallestLeaf(root);
else if (strcmp(&nextCommand[2], "hasDuplicateItem") == 0)
checkDuplicateItemonTree(root);
else if (strcmp(&nextCommand[2], "convertToBinarySearchTree") == 0)
convertToBinarySearchTree(root);
}
return 0;
}