查找堆中的最大值(Scheme)

时间:2015-11-15 22:43:14

标签: list scheme max heap

我正在尝试返回一个返回堆中最大值的函数(其中堆从顶部的min开始到底部的max)。我理解如何在BST中做类似的事情。但我不知道如何在堆中这样做,因为我不完全理解堆的组织。在BST中我会一直向左走,直到我走到尽头。但是如果我继续走到堆的底部,那么最大值可能在另一个子树上。 (不确定这是否完全合理)。任何帮助如何处理这一点将不胜感激。提前致谢。

*编辑

所以我想到了一种不同的方法来解决这个问题,但这并不正确。基本上在得出堆只是一堆嵌套列表的结论之后,我创建了一个代码,使堆成为一个列表并使用另一个获取最大值的辅助函数。但是,如何通过实际查看每个节点来解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

是的,在最小堆中,每个节点只能保证大于它的父节点。完整的步行将给出一个解决方案,但通过在结构底部的单独树中实现最大值,您可以更聪明一些。您也可以先使用let来强制评估最左边的树。假设堆的二进制结构。

(define (max-heap min-heap)
  ((empty-heap? min-heap)
   (error "empty heap has no maximum")
  ((singleton? min-heap)
   (node min-heap))
  ((empty-heap? (left-heap min-heap))
   (max-heap (right-heap min-heap)))
  ((empty-heap? (right-heap min-heap))
   (max-heap (left-heap min-heap)))
  (else 
   (let ((left-max (max-heap (left-heap min-heap))))
     (let ((right-max (max-heap (right-heap))))
       (if (> left-max right-max) left-max right-max))))))

你仍然需要走遍整棵树,但你只需要做一次。而你的堆栈只有堆的深度。