배열의 범위를 절반씩 쪼개며 트리를 구성하는 방식입니다.
[start, end]의 중앙값(mid)을 찾아 현재 서브트리의 루트 노드로 생성합니다.start부터 mid - 1까지의 범위는 왼쪽 자식 노드로 보냅니다.mid + 1부터 end까지의 범위는 오른쪽 자식 노드로 보냅니다.start > end)될 때까지 이 과정을 반복하여 전체 트리를 완성합니다.public class Solution_Leetcode_108 {
public TreeNode sortedArrayToBST(int[] nums) {
// 배열 전체 범위를 대상으로 트리 구성 시작
return organize(nums, 0, nums.length - 1);
}
private TreeNode organize(int[] nums, int start, int end) {
// 기저 사례: 더 이상 처리할 범위가 없으면 null 반환
if (start > end) {
return null;
}
// 중간값 계산: 비트 연산(Right Shift)을 통해 가독성과 미세한 성능 최적화
// (start + end) / 2 와 동일한 로직
int mid = (start + end) >> 1;
// 중앙값을 루트로 하여 좌우 서브트리를 재귀적으로 빌드
TreeNode left = organize(nums, start, mid - 1);
TreeNode right = organize(nums, mid + 1, end);
// 현재 노드 생성 및 계산된 자식 노드들 연결
return new TreeNode(nums[mid], left, right);
}
}
(start + end) / 2 대신 비트 우측 시프트 연산(>> 1)을 사용했습니다. 이는 나눗셈 연산에 비해 CPU 사이클 소모가 적은 저수준 연산으로 처리되며, 이진 탐색 기반 로직에서 중간 인덱스를 도출하는 의도를 명확히 합니다.start, end)만 재귀 인자로 넘겨 처리했습니다. 따라서 추가 메모리 할당 없이 재귀 호출 스택 깊이인 내에서 동작합니다.