Ruby Heapify实现/优化

时间:2015-11-16 05:56:39

标签: ruby algorithm recursion tree heap

我在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

我在这里缺少什么?或者堆化树真的需要每个方法调用三次递归调用吗?

1 个答案:

答案 0 :(得分:1)

对于将来磕磕绊绊的人,正确的方法是堆积一个代表树的数组,而不是实际的二元树,父和左,和正确的指针。

维基百科的这一部分真的帮助了我:https://en.wikipedia.org/wiki/Binary_heap#Heap_implementation