12
从排序的整数列表中创建平衡的BST
给定一个唯一的,排序的整数列表,创建一个平衡的二进制搜索树,表示为数组而不使用递归。 例如: 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字符数表示的最简洁的代码胜出,但是我也希望看到针对任何特定语言的优雅解决方案。 测试用例 简单数组的输出,包含1to的nfor n。如上所述,尾随0s是可选的。 [] [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]