【发布时间】:2012-09-21 13:14:46
【问题描述】:
在互联网的某个地方看到这个问题并试图解决它。我可以解决堆是严格二叉树的情况(通过重复划分前序遍历)但当堆只是完全二叉树时无法找出算法。
例如,如果1, 2, 3, 4, 5, 6, 7 是最小堆的前序遍历,
堆大小为7
1是堆中的第一个元素(考虑到堆表示为数组)
下一个(size - 1) / 2 元素将位于1 的左子树中
2, 3, 4 将在1 的左子树中
最后一个(size - 1) / 2 元素将在1 的右子树中
5, 6, 7 将在1 的右子树中
可以通过递归应用此逻辑来构造完整的堆。
该解决方案适用于此类堆是严格二叉树的情况
1
2 3
4 5 6 7
但显然,这在非叶元素有一个或没有子元素的堆的情况下不起作用。例如,
1 1
2 3 2 3
4 5 6 4 5
我想不出任何干净的算法可以做到这一点。任何解决方案/建议都会有帮助。
【问题讨论】:
-
A binary heap 根据定义是一棵完整的树,因此您所描述的它不起作用的情况 - 不会发生在二叉堆中。你说的是二叉堆吗?
-
considering, the heap is represented as an array,不,表示为前序遍历。忘记它是如何存储在数组中的。 -
But apparently, this does not work in case of heap where a non-leaf element has one or no children. I couldn't think of any clean algorithms that could do the same.你能举个这样的例子吗,所以我们都在谈论同一件事? -
@phant0m,想象一棵大小为 4 的树:A 的孩子是 B 和 C,B 的孩子是 D。这是一棵完全二叉树,其中非叶元素有一个孩子。我认为其他情况(没有孩子)是不可能的,因为根据定义,非叶节点必须至少有一个孩子。
-
@Kevin,不,我的意思是一个预购遍历示例,它显示了他的想法失败的地方。据我了解,他只提供了一个他的想法有效的深入示例,但没有提供失败的示例,这会更有趣。此外,每个人都可以根据相同的示例提出解决方案。
标签: algorithm heap tree-traversal