存储在数组中的二进制搜索树的就地平衡

时间:2014-10-19 12:25:54

标签: arrays algorithm binary-search-tree tree-balancing

假设我有一个不平衡的BST。 BST存储在数组中,其中root位于索引0处,索引 k 上的节点的左右子节点位于索引 2k 2k分别为+ 1 。例如树:

      5                            4
     /                            / \
    3        --balancing-->      2   5
   /\                           / \
  2  4                         1   3
 /
1                         

将存储在数组[5, 3, nil, 2, 4, nil, nil, 1, nil, ...]中,我想平衡它,以便结果搜索树的最大高度最小(=没有比存储数据所需的更多级别)。
例如,它可以是一个树,其中数组中的值之间没有间隙,并且所有的nil值都是" push"到后面(注意:这个树的定义实际上比我前一段中的目标更具限制性)。例如,[4, 2, 5, 1, 3, nil, ...]以上 有这样的算法吗?如果没有,是否有类似的算法平衡树至少"好"。

其他信息:
- 算法需要就地,只允许O(1)额外的内存 - this问题中提到了一个算法,但它依赖于交换指针(数组需要大2 ^ n) - 有一个非常相似question,遗憾的是,接受的答案只是关于树木的一般性讨论。 (我没有AVL平衡树的元数据,对吗?如果我弄错了,请证明我错了)

- 可接受的答案也可能是没有这样的算法,如果是这种情况,请包括一些参考/证明或逻辑假设

0 个答案:

没有答案