我在Ruby中实现了一个Heapify算法(即将二叉树转换为堆),并认为下面的工作原理。我担心的是我进行了太多的递归调用。
第一次和第二次递归调用是从左右子树中选择最高节点,第三次递归调用是在我交换节点时做同样的事情。 Haven包含了我的swap_parent_child方法,有点长但是有效。
def max_heapify(node)
return nil if node.nil?
return node if node.left.nil? && node.right.nil?
left = max_heapify(node.left)
right = max_heapify(node.right)
max_value = find_max_value(node, left, right)
if node.value == max_value
node
elsif left && left.value == max_value
swap_parent_child(node, left)
max_heapify(node)
left
else
swap_parent_child(node, right)
max_heapify(node)
right
end
end
def find_max_value(node, node2, node3)
max_value = node.value
max_value = node2.value if node2 && node2.value > max_value
max_value = node3.value if node3 && node3.value > max_value
max_value
end
我已经检查了此处列出的算法,但我不相信它有效。 https://www.cs.rit.edu/~rpj/courses/bic2/studios/studio1/studio121.html#M502
似乎算法根据该网站将执行以下操作并停止。
5 5
|\ | \
2 4 => 10 4
| |
10 2
我在这里缺少什么?或者堆化树真的需要每个方法调用三次递归调用吗?
答案 0 :(得分:1)
对于将来磕磕绊绊的人,正确的方法是堆积一个代表树的数组,而不是实际的二元树,父和左,和正确的指针。
维基百科的这一部分真的帮助了我:https://en.wikipedia.org/wiki/Binary_heap#Heap_implementation