I have written Red–black tree in Kotlin. Fun insertFixup restores balance after inserting new element (z: Node? is new element). Algorithm of tree balancin
Kotlin function parameters are read-only values and are not assignable.
You can however create a ReadWriteProperty object to pass to insertFixup for getting/setting newNode:
...
class BinarySearchTree {
...
fun insertFixup(zProperty: ReadWriteProperty) {
var z by zProperty
...
fun main(args: Array) {
val bst = BinarySearchTree()
var newNode: Node? = null
val newNodeProperty = object : ReadWriteProperty {
override operator fun getValue(thisRef: Any?, property: KProperty<*>): Node? {
return newNode
}
override operator fun setValue(thisRef: Any?, property: KProperty<*>,
value: Node?) {
newNode = value
}
}
while (true) {
newNode = Node(readLine()!!.toInt())
bst.insert(newNode!!)
bst.insertFixup(newNodeProperty)
}
}
And if you are willing to use a property instead of a variable then you can use a property reference for getting/setting newNode from insertFixup instead:
...
class BinarySearchTree {
...
fun insertFixup(zProperty: KMutableProperty0) {
var z by zProperty
...
var newNode: Node? = null
fun main(args: Array) {
val bst = BinarySearchTree()
while (true) {
newNode = Node(readLine()!!.toInt())
bst.insert(newNode!!)
bst.insertFixup(::newNode)
}
}
// the following allow `KMutableProperty0` to be used as a read/write delegate
operator fun KProperty0.getValue(thisRef: Any?, property: KProperty<*>): T = get()
operator fun KMutableProperty0.setValue(thisRef: Any?, property: KProperty<*>,
value: T) = set(value)