https://leetcode.com/problems/increasing-order-search-tree Easy

Условие

Дано бинарное дерево поиска. Нужно перестроить его в виде дерева, где все узлы следуют в возрастающем порядке, и каждый узел имеет только правого потомка.

Примеры

Input: root = [5, 3, 6, 2, 4, null, 8, 1, null, null, null, 7, 9] Output: [1, null, 2, null, 3, null, 4, null, 5, null, 6, null, 7, null, 8, null, 9]

Input: root = [5, 1, 7] Output: [1, null, 5, null, 7]

Решение

/**
 * Example:
 * var ti = TreeNode(5)
 * var v = ti.`val`
 * Definition for a binary tree node.
 * class TreeNode(var `val`: Int) {
 *     var left: TreeNode? = null
 *     var right: TreeNode? = null
 * }
 */
fun increasingBST(root: TreeNode?): TreeNode? {
    // Вспомогательная функция для инOrder обхода
    fun inorder(node: TreeNode?, list: MutableList<Int>) {
        if (node == null) return
        inorder(node.left, list)
        list.add(node.`val`)
        inorder(node.right, list)
    }

    // Собираем элементы дерева в списке
    val values = mutableListOf<Int>()
    inorder(root, values)

    // Строим новое дерево из отсортированного списка
    val dummyNode = TreeNode(0)
    var current = dummyNode
    for (value in values) {
        current.right = TreeNode(value)
        current = current.right!!
    }
    return dummyNode.right
}

Временная сложность

O(N), где N — количество узлов в дереве (обход + создание нового дерева).

Пространственная сложность

O(N), так как используется дополнительный список для хранения значений.