假设我有一个不平衡的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平衡树的元数据,对吗?如果我弄错了,请证明我错了)
- 可接受的答案也可能是没有这样的算法,如果是这种情况,请包括一些参考/证明或逻辑假设