我们得到一个 2 m - 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