我已經在Kotlin寫了紅黑樹。樂趣insertFixup插入新元素後恢復平衡(z:節點?是新元素)。樹均衡算法取自here(第2-3頁)。該問題是科特林不允許我重新分配ž到z.parent和z.parent.parent。我想z是一個指針。問題是如何讓Kotlin明白我想從他那裏得到什麼?Kotlin函數參數:Val不能被重新分配
class Node(key: Int) {...}
class BinarySearchTree {
var root: Node? = null
fun insert(newNode: Node) {...}
fun RotateLeft(x: Node?) {...}
fun RotateRight(x: Node?) {...}
fun insertFixup(z: Node?) {
var y: Node?
while (z?.parent?.color == "RED") {
if (z?.parent == z?.parent?.parent?.left) {
y = z?.parent?.parent?.right
if (y?.color == "RED") {
z?.parent?.color = "BLACK"
y?.color = "BLACK"
z?.parent?.parent?.color = "RED"
z = z?.parent?.parent
}
if (z == z?.parent?.right) {
z = z?.parent
RotateLeft(z)
z?.parent?.color = "BLACK"
z?.parent?.parent?.color = "RED"
RotateRight(z?.parent?.parent)
}
} else {
y = z?.parent?.parent?.left
if (y?.color == "RED") {
z?.parent?.color = "BLACK"
y?.color = "BLACK"
z?.parent?.parent?.color = "RED"
z = z?.parent?.parent
}
if (z != z?.parent?.left) {
z = z?.parent
RotateLeft(z)
z?.parent?.color = "BLACK"
z?.parent?.parent?.color = "RED"
RotateRight(z?.parent?.parent)
}
}
}
root?.color = "BLACK"
}
}
fun main(args: Array<String>) {
val bst = BinarySearchTree()
while (true) {
var newNode = Node(readLine()!!.toInt())
bst.insert(newNode)
bst.insertFixup(newNode)
}
}
UPD:感謝所有!所有的答案都很有幫助,我在你的回覆中找到了解決方案。在科特林
A小調記:我覺得你可以大大提高代碼,如果你檢查是否'z'在開始o是'null'與否只有一次f'insertFixup'。現在到處都是''''' – voddan