Java 如何使用节点在堆数据结构中实现percolate down函数?

Java 如何使用节点在堆数据结构中实现percolate down函数?,java,data-structures,heap,Java,Data Structures,Heap,我通过使用节点生成二叉树而不是数组来创建最大堆数据结构。 现在,我想创建一个渗透函数,我应该如何实现这个函数?除了递归,还有别的方法吗?我正在尝试使用循环,但我所有的尝试都失败了,我希望有人能帮助我,提前谢谢你。我认为类似的方法应该会奏效: do { var currNode = root var maxChild = if (currNode.left.value > currNode.right.value) currNode.left else currNode.ri

我通过使用节点生成二叉树而不是数组来创建最大堆数据结构。
现在,我想创建一个渗透函数,我应该如何实现这个函数?除了递归,还有别的方法吗?我正在尝试使用循环,但我所有的尝试都失败了,我希望有人能帮助我,提前谢谢你。

我认为类似的方法应该会奏效:

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)
do{
var currNode=root
var maxChild=if(currNode.left.value>currNode.right.value)currNode.left else currNode.right
if(currNode.value
递归只是思考循环的另一种方式(或者相反)。 递归形式的相同解决方案:

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)
def percolateDown(currNode:Node):单位={
val maxChild=if(currNode.left.value>currNode.right.value)currNode.left else currNode.right
if(currNode.value

编辑:需要更多的检查来检测currNode何时是叶节点并且没有子节点。

非常感谢,但是while循环在O(logn)上有效吗?或者O(n)?我认为while循环和递归方法都在O(logn)中运行,因为它们在max heap的二叉树中最多只能执行1个swap/level,当您输入n个值时,该树将具有logn级别。