package LeetCode_310 import java.util.* import kotlin.collections.ArrayList /** * 310. Minimum Height Trees * https://leetcode.com/problems/minimum-height-trees/description/ * */ class Solution { fun findMinHeightTrees(n_: Int, edges: Array<IntArray>): List<Int> { var n = n_ val result = ArrayList<Int>() if (n == 0) { return result } if (n == 1) { result.add(0) return result } //init and create graph val graph = ArrayList<ArrayList<Int>>() for (i in 0 until n) { graph.add(ArrayList()) } for (edge in edges) { graph.get(edge[0]).add(edge[1]) graph.get(edge[1]).add(edge[0]) } val queue = LinkedList<Int>() for (i in 0 until n) { //add leaf node into queue if (graph.get(i).size == 1) { queue.offer(i) } } //reduce level while (n > 2) { val size = queue.size n -= size for (i in 0 until size) { val leafNode = queue.poll()//get the leaf node for (node in graph[leafNode]) {//find out leaf node's connect node graph.get(node).remove(leafNode)//remove the node's connection if (graph.get(node).size == 1) { queue.offer(node) } } } } while (queue.isNotEmpty()) { result.add(queue.poll()) } return result } }