Я пытался решить вопрос об алгоритме из Leetcode; называется " Деревья минимальной высоты ".
Я пытался использовать 2 цвета (посещенные, еще не посещенные), а затем рекурсивно вызвать вспомогательную функцию для увеличения высоты. Но я немного застрял на последнем шаге, где я прокомментировал. Я не могу придумать, как указать, при каких условиях я должен проверять высоту.
Ниже приведен мой код. Если кто-нибудь может мне помочь, я ценю. Спасибо.
class Solution {
enum Color{
White,Grey;
}
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
int minHeight = Integer.MAX_VALUE;
List<List<Integer>> adjLists = buildGraph(n, edges);
List<Integer> ret = new ArrayList<>();
Color[] visited = new Color[n];
Arrays.fill(visited, Color.White);
for(int i = 0; i < n; i++){
calculateHeight(adjLists, i, edges, visited, 0, ret);
}
return ret;
}
private List<List<Integer>> buildGraph(int n, int[][] edges){
List<List<Integer>> adjLists = new ArrayList<>();
for(int i = 0; i < n; i++){
adjLists.add(new ArrayList<>());
}
for(int[] node : edges){
int v = node[0], u = node[1];
adjLists.get(u).add(v);
adjLists.get(v).add(u);
}
return adjLists;
}
private void calculateHeight(List<List<Integer>> adjLists, int start, int[][] edges, Color[] visited, int height, List<Integer> ret){
/* I feel like I miss some conditions here but any idea is not top on my head for a week */
if(visited[start] == Color.Grey)
return;
visited[start] = Color.Grey;
for(int v : adjLists.get(start)){
calculateHeight(adjLists, v, edges, visited, height+1, ret);
}
visited[start] = Color.White;
return;
}
}
}