在互联网的某个地方看到这个问题并试图解决它。对于堆是严格二叉树的情况(通过重复划分前序遍历),我可以解决它,但当堆只是一棵完整的二叉树时无法找出算法。
例如,如果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
我想不出任何干净的算法可以做到这一点。任何解决方案/建议都会有帮助。