https://coderun.yandex.ru/problem/second-maximum/description | Легкая |
---|
Выведите второй по величине элемент в бинарном дереве поиска, построенном на заданных элементах. Гарантируется, что такой найдется.
Ввод:
7 3 2 1 9 5 4 6 8 0Вывод:
8
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
// Класс узла бинарного дерева поиска (BST)
class Node(val value: Int) {
var left: Node? = null
var right: Node? = null
}
// Класс бинарного дерева поиска (BST)
class BST {
var root: Node? = null // Корневой узел дерева
// Метод вставки нового элемента в дерево
fun insert(value: Int) {
root = insertRec(root, value)
}
// Рекурсивный метод вставки значения в дерево
private fun insertRec(node: Node?, value: Int): Node {
if (node == null) return Node(value) // Создаем новый узел, если достигли пустого места
when {
value < node.value -> node.left = insertRec(node.left, value) // Вставляем в левое поддерево
value > node.value -> node.right = insertRec(node.right, value) // Вставляем в правое поддерево
}
return node
}
// Метод поиска второго максимального элемента в дереве
fun findSecondMax(): Int {
var parent: Node? = null // Родительский узел для самого большого элемента
var current = root // Начинаем с корня
// Ищем максимальный элемент (крайний правый узел)
while (current?.right != null) {
parent = current
current = current.right
}
return if (current?.left != null) {
findMax(current.left!!) // Если у максимального есть левое поддерево, ищем максимум в нем
} else {
parent!!.value // Иначе возвращаем родителя максимального узла
}
}
// Метод поиска максимального элемента в поддереве
private fun findMax(node: Node): Int {
var current = node
while (current.right != null) {
current = current.right!!
}
return current.value
}
}
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val bst = BST() // Создаем экземпляр бинарного дерева поиска
val parts = reader.readLine().split(" ").map { it.toInt() } // Читаем входные данные
// Вставляем числа в дерево, прерываемся при встрече 0
for (num in parts) {
if (num == 0) break
bst.insert(num)
}
writer.write("${bst.findSecondMax()}\\n") // Выводим второй максимальный элемент
reader.close()
writer.flush()
writer.close()
}