我正在尝试返回一个返回堆中最大值的函数(其中堆从顶部的min开始到底部的max)。我理解如何在BST中做类似的事情。但我不知道如何在堆中这样做,因为我不完全理解堆的组织。在BST中我会一直向左走,直到我走到尽头。但是如果我继续走到堆的底部,那么最大值可能在另一个子树上。 (不确定这是否完全合理)。任何帮助如何处理这一点将不胜感激。提前致谢。
*编辑
所以我想到了一种不同的方法来解决这个问题,但这并不正确。基本上在得出堆只是一堆嵌套列表的结论之后,我创建了一个代码,使堆成为一个列表并使用另一个获取最大值的辅助函数。但是,如何通过实际查看每个节点来解决这个问题呢?
答案 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))))))
你仍然需要走遍整棵树,但你只需要做一次。而你的堆栈只有堆的深度。