고유 한 정렬 된 정수 목록이 제공되면 재귀를 사용하지 않고 배열로 표시되는 균형 이진 검색 트리를 만듭니다.
예를 들면 다음과 같습니다.
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 사이의 길이 입니다.
- 루트 노드가 0 위치에 있고 높이가 log (n) 과 동일한 BST를 나타내는 배열입니다. 여기서 0은 누락 된 노드를 나타냅니다 (또는
null
언어가 허용하는 경우 유사한 값). 빈 노드, 현재는 단지 나무의 끝 부분에 존재해야하는 경우 (예[2,1,0]
)
입력 정수 배열은 다음을 보장합니다.
- 값은 0보다 큰 32 비트 부호있는 정수입니다.
- 값은 고유합니다.
- 값은 위치 0부터 오름차순입니다.
- 값이 희박 할 수 있습니다 (즉, 서로 인접하지 않음).
ascii 문자 수에 의해 가장 간결한 코드가 승리하지만 특정 언어에 대한 우아한 솔루션을 보는 데 관심이 있습니다.
테스트 사례
함유 단순 어레이에 대한 출력 1
을 n
여러 대 n
. 전술 한 바와 같이, 후행 0
은 선택적이다.
[]
[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]