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级别。