私はこのような何かが動作するはずだと思う:
do {
var currNode = root
var maxChild = if (currNode.left.value > currNode.right.value) currNode.left else currNode.right
if (currNode.value < maxChild.value) {
val tempValue = currNode.value
currNode.value = maxChild.value
maxChild.value = tempValue
currNode = maxChild
} else {
break
}
} while (true)
再帰はループ(またはその逆)を考えるの唯一の別の方法です。 再帰的な形で同じ溶液:
def percolateDown(currNode: Node): Unit = {
val maxChild = if (currNode.left.value > currNode.right.value) currNode.left else currNode.right
if (currNode.value < maxChild.value) {
val tempValue = currNode.value
currNode.value = maxChild.value
maxChild.value = tempValue
percolateDown(maxChild)
}
}
percolateDown(root)
編集:いくつかのより多くのチェックがcurrNodeが葉で、子供を持っていないときを検出するために必要とされます。
ありがとうございますが、whileループはO(logn)で動作しますか?またはO(n)? –
私はwhileループと再帰メソッドの両方がO(logn)で実行されると思います。両方ともmax-heapのバイナリツリーで1スワップ/レベルを実行し、nを入れるとツリーはlognレベルを持ちます値。 –