【发布时间】:2011-06-25 08:37:59
【问题描述】:
我们得到一个由 2m 组成的数组 - 1 个不同的、可比较的元素,从 1 开始索引。
我们可以把数组看成一棵完全二叉树:
Node is placed at index i.
Left child is placed at 2i.
Right child is placed at 2i+1.
比如数组
[7 6 4 5 2 3 1]
是树
7
/ \
6 4
/ \ / \
5 2 3 1
现在当被视为二叉树时,这些元素满足堆属性,一个节点大于它的两个子节点:
A[i] > A[2i] and A[i] > A[2i+1]
是否有相当快速的就地算法来打乱数组元素,以便生成的二叉树(如上所述)是二叉搜索树?
回想一下,在二叉搜索树中,一个节点大于其所有左后代,小于其所有右后代。
例如,上述数组的重新洗牌将是
[4 2 6 1 3 5 7]
对应二叉搜索树
4
/ \
2 6
/ \ / \
1 3 5 7
【问题讨论】:
-
我觉得这个问题很有趣。我用对我来说似乎最合理的解释对其进行了编辑。 (正如 R.. 所说,如果您知道这些术语,那确实是有道理的)。
-
就地对您意味着什么?
O(1),非常严格,还是O(log n),这是实际定义? -
@ltjax:RAM 模型中的 O(logn) 或 O(1) 个字。
标签: c algorithm heap binary-tree