题目:
题解:
int* findMinHeightTrees(int n, int** edges, int edgesSize, int* edgesColSize, int* returnSize){
int * res = NULL;
if (n == 1) {
res = (int *)malloc(sizeof(int));
*res = 0;
*returnSize = 1;
return res;
}
struct ListNode ** adj = (struct ListNode *)malloc(sizeof(struct ListNode *) * n);
int * degree = (int *)malloc(sizeof(int) * n);
memset(degree, 0, sizeof(int) * n);
for (int i = 0; i < n; i++) {
adj[i] = NULL;
}
for (int i = 0; i < edgesSize; i++) {
int u = edges[i][0];
int v = edges[i][1];
struct ListNode * node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = u;
node->next = adj[v];
adj[v] = node;
node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = v;
node->next = adj[u];
adj[u] = node;
degree[u]++;
degree[v]++;
}
int * queue = (int *)malloc(sizeof(int) * n);
int head = 0;
int tail = 0;
for (int i = 0; i < n; i++) {
if (degree[i] == 1) {
queue[tail++] = i;
}
}
int remainNodes = n;
while (remainNodes > 2) {
int sz = tail - head;
remainNodes -= sz;
for (int i = 0; i < sz; i++) {
int curr = queue[head++];
struct ListNode * node = adj[curr];
while (node) {
int v = node->val;
degree[v]--;
if (degree[v] == 1) {
queue[tail++] = v;
}
node = node->next;
}
}
}
res = (int *)malloc(sizeof(int) * remainNodes);
*returnSize = remainNodes;
int pos = 0;
while (head != tail) {
res[pos++] = queue[head++];
}
free(queue);
free(degree);
for (int i = 0; i < n; i++) {
struct ListNode * node = adj[i];
while (node) {
struct ListNode * curr = node;
node = curr->next;
free(curr);
}
}
free(adj);
return res;
}