给定一个唯一的,排序的整数列表,创建一个平衡的二进制搜索树,表示为数组而不使用递归。
例如:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
在开始之前,有个提示:我们可以将这个问题简化很多,这样我们实际上就不必考虑输入整数(或者与此有关的任何可比较对象!)。
如果我们知道输入列表已经排序,则其内容无关紧要。我们可以简单地根据原始数组的索引来考虑它。
输入数组的内部表示将变为:
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
这意味着我们不必编写必须处理类似对象的东西,而只需要编写一个将[0,n)范围映射到结果数组的函数。获得新订单后,我们可以简单地将映射应用于输入中的值以创建返回数组。
有效的解决方案必须:
- 接受零元素数组并返回一个空数组。
- 接受长度为n的整数数组并返回整数数组
- 长度在n与2的下一个最高幂减1之间。(例如,对于输入大小13,返回13到15之间的任意值)。
- 表示BST的数组,其中根节点位于位置0,高度等于log(n),其中0表示丢失的节点(
null
如果您的语言允许,则为类似值)。空节点(如果存在)必须仅存在于树的末尾(例如[2,1,0]
)
输入整数数组具有以下保证:
- 值是大于零的32位有符号整数。
- 价值观是独一无二的。
- 值从零位置开始按升序排列。
- 值可能很稀疏(即彼此不相邻)。
以ascii字符数表示的最简洁的代码胜出,但是我也希望看到针对任何特定语言的优雅解决方案。
测试用例
简单数组的输出,包含1
to的n
for n
。如上所述,尾随0
s是可选的。
[]
[1]
[2,1,0]
[2,1,3]
[3,2,4,1,0,0,0]
[4,2,5,1,3,0,0]
[4,2,6,1,3,5,0]
[4,2,6,1,3,5,7]
[5,3,7,2,4,6,8,1,0,0,0,0,0,0,0]
[6,4,8,2,5,7,9,1,3,0,0,0,0,0,0]
[7,4,9,2,6,8,10,1,3,5,0,0,0,0,0]
[8,4,10,2,6,9,11,1,3,5,7,0,0,0,0]
[8,4,11,2,6,10,12,1,3,5,7,9,0,0,0]
[8,4,12,2,6,10,13,1,3,5,7,9,11,0,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,0]
[8,4,12,2,6,10,14,1,3,5,7,9,11,13,15]