import scala.collection.mutable
import scala.collection.mutable.{HashMap, ArrayBuffer}
object Main {
class TreeNode(var value: Int) {
var children: ArrayBuffer[TreeNode] = new ArrayBuffer[TreeNode]()
}
def getDevices(root: TreeNode, server: TreeNode, ttl: Int): ArrayBuffer[Int] = {
var neighbors = new HashMap[Int, ArrayBuffer[Int]]
dfs(null, root, neighbors)
var bfs = new ArrayBuffer[Int]
bfs += server.value
var lookup = new mutable.HashSet[Int]
for(b <- bfs){
lookup += b
}
var i = 0
while(i<ttl){
var temp = new ArrayBuffer[Int]
for (node <- bfs) {
for (nei <- neighbors(node)) {
if (lookup.contains(nei) == false)
temp += nei
}
}
i += 1
bfs = temp
for(b <- bfs){
lookup += b
}
}
bfs
}
private def dfs(parent: TreeNode, child: TreeNode, neighbors: HashMap[Int, ArrayBuffer[Int]]): Unit = {
if (child == null) {
return
}
if (parent != null) {
if (!neighbors.contains(parent.value))
neighbors.put(parent.value, new ArrayBuffer[Int])
if (!neighbors.contains(child.value))
neighbors.put(child.value, new ArrayBuffer[Int])
neighbors(parent.value)+= child.value
neighbors(child.value) += parent.value
}
for (i <- 0 until child.children.size) {
dfs(child, child.children(i), neighbors)
}
}
def main(args: Array[String]): Unit = {
val root = new TreeNode(1)
root.children += new TreeNode(2)
root.children += new TreeNode(3)
root.children += new TreeNode(4)
root.children(0).children += new TreeNode(5)
root.children(0).children(0).children += new TreeNode(10)
root.children(0).children += new TreeNode(6)
root.children(0).children(1).children += new TreeNode(11)
root.children(0).children(1).children += new TreeNode(12)
root.children(0).children(1).children += new TreeNode(13)
root.children(2).children += new TreeNode(7)
root.children(2).children += new TreeNode(8)
root.children(2).children += new TreeNode(9)
val server = root.children(0).children(1)
val ttl = 2
println("The TTL value will expire on node IDs: " + getDevices(root, server, ttl))
}
}