object BinaryTreeDistanceK { def distanceK(root: Option[TreeNode], target: TreeNode, k: Int): List[Int] = { val result = scala.collection.mutable.ListBuffer[Int]() def findKDistanceNodes(node: Option[TreeNode], distance: Int): Unit = { node match { case Some(currentNode) => if (distance == k) { result += currentNode.value } else { findKDistanceNodes(currentNode.left, distance + 1) findKDistanceNodes(currentNode.right, distance + 1) } case None => } } def findTarget(node: Option[TreeNode]): Int = { node match { case Some(currentNode) if currentNode == target => findKDistanceNodes(currentNode, 0) return 1 case Some(_) => val leftDistance = findTarget(node.get.left) val rightDistance = findTarget(node.get.right) if (leftDistance > 0) { if (leftDistance == k) { result += node.get.value } findKDistanceNodes(node.get.right, leftDistance + 1) return leftDistance + 1 } else if (rightDistance > 0) { if (rightDistance == k) { result += node.get.value } findKDistanceNodes(node.get.left, rightDistance + 1) return rightDistance + 1 } else { -1 } case None => -1 } } findTarget(root) result.toList } def main(args: Array[String]): Unit = { // Define the binary tree val tree = Some( TreeNode( 3, Some(TreeNode(5, Some(TreeNode(6, None, None)), Some(TreeNode(2, Some(TreeNode(7, None, None)), Some(TreeNode(4, None, None)))))) ) ) val targetNode = tree.get.left.get.right.get // Find nodes at distance K from the target node val k = 2 val nodesAtDistanceK = distanceK(tree, targetNode, k) println(s"Nodes at distance $k from target node: ${nodesAtDistanceK.mkString(", ")}") } }