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
}
}