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), так как используется дополнительный список для хранения значений.