一意のソートされた整数のリストを指定して、再帰を使用せずに配列として表されるバランスの取れたバイナリ検索ツリーを作成します。
例えば:
func( [1,2,3,5,8,13,21] ) => [5,2,13,1,3,8,21]
始める前に、ヒント:この問題を1トン単純化し、入力整数(またはその点で同等のオブジェクト)を実際に考慮する必要がないようにします。
入力リストが既にソートされていることがわかっている場合、そのコンテンツは無関係です。元の配列へのインデックスの観点から単純に考えることができます。
入力配列の内部表現は次のようになります。
func( [0,1,2,3,4,5,6] ) => [3,1,5,0,2,4,6]
これは、比較可能なオブジェクトを処理する必要があるものを記述するのではなく、範囲[0、n)から結果の配列にマップする関数を記述するだけでよいことを意味します。新しい順序を取得したら、入力の値にマッピングを適用して戻り配列を作成できます。
有効なソリューションは次の要件を満たす必要があります。
- ゼロ要素配列を受け入れ、空の配列を返します。
- 長さnの整数配列を受け入れ、整数配列を返します
- nから2マイナス1の次に高い累乗の間の長さ(たとえば、入力サイズ13の場合、13から15の間のいずれかを返します)。
- ルートノードが位置0にあり、高さがlog(n)に等しいBSTを表す配列。0は欠落ノード(または
null
言語で許可されている場合は-like値)を表します。空のノードは、存在する場合、のみ(例えば、木の端部に存在しなければなりません[2,1,0]
)
入力整数配列には、次の保証があります。
- 値はゼロより大きい32ビット符号付き整数です。
- 値は一意です。
- 値は、位置ゼロから昇順です。
- 値はまばらかもしれません(すなわち、互いに隣接していない)。
ASCII文字カウントによる最も簡潔なコードが優先されますが、特定の言語向けのエレガントなソリューションを見ることにも興味があります。
テストケース
含む単純なアレイの出力1
にn
種々のため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]