728x90
Top Interview Questions 의 Easy Collection에 있는 문제입니다.         
문제는 여기서 볼 수 있습니다.

Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree.

 

Example 1:

Input: nums = [-10,-3,0,5,9]
Output: [0,-3,9,-10,null,5]
Explanation: [0,-10,5,null,-3,null,9] is also accepted:

Example 2:

Input: nums = [1,3]
Output: [3,1]
Explanation: [1,null,3] and [3,1] are both height-balanced BSTs.

 

Constraints:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums is sorted in a strictly increasing order. (값의 중복이 없다는 의미)

Code:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

    
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:        
        def dfs(left, right):
            if left > right: return    
            mid=(left+right+1)//2
            root=TreeNode(nums[mid])
            root.left=dfs(left, mid-1)
            root.right=dfs(mid+1, right)

            return root
        
        if not nums: return None
        return dfs(0, len(nums)-1)

1. 숫자가 담긴 리스트가 주어졌을 때 이들을 활용해 이진탐색트리를 생성하는 과정입니다.

2. 중위순회(inorder)하여야 한다.

3. 정수 리스트는 오름차순 정렬되어 주어집니다.

4. 분할정복으로 dfs를 진행합니다.(def dfs)

 

위 코드는 그냥 외워두고 쓰는 게 좋을 것 같다.

 

참고

 

leetcode 108. Convert Sorted Array to Binary Search Tree 정렬된 배열의 이진 탐색 트리 변환 문제풀이

책에서 다룬 리트코드 문제들을 풀이한 포스팅이다. 문제는 모두 리트코드에 출제된 문제들이며, 직접 풀었지만, 책에서 주는 힌트와 풀이 과정들을 참고한 경우가 많다. 이곳은 정리한 책에 나

rollingsnowball.tistory.com

다른 풀이:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        root = TreeNode()   

        if not nums:
            return None
        
        mid_index = len(nums)//2
        root.val = nums[mid_index]
        
        root.left = self.sortedArrayToBST(nums[:mid_index])
        root.right = self.sortedArrayToBST(nums[mid_index+1:])

        return root

 

self는 꼭 있어야 한다. 클래스 Solution이 self이다. 그러니까 self.sortedArrayBST는 Solution.sortedArrayToBST를 이른다.

1. 이미 오름차순 정렬되어 있는 상태이므로, 중간 값을 뽑으면 실제로도 중앙값이다. 따라서 이를 val로 삼는다.

2. 그리고 이 중간의 인덱스를 기준으로 앞쪽의 범위와 뒤쪽의 범위로 나누어 각각을 왼쪽 트리, 오른쪽 트리로 삼는다.

3. 이때 재귀적으로 sortedArrayToBST에 위에서 나눈 리스트 두개를 각각 인자로 전달한다.

4. 위와 같은 방식으로 트리를 끝까지 생성하면 root를 리턴한다.

5. 넘겨 받은 인자가 없으면 None을 리턴한다.

 

 

728x90

'알고리즘' 카테고리의 다른 글

[Leetcode/Python] Missing Number  (0) 2022.11.21
[Leetcode/Python] Reverse Bits  (0) 2022.11.21
[Leetcode/Python] Roman to Integer  (0) 2022.11.15
[Leetcode/Python] House Robber  (0) 2022.11.15
[Leetcode/Python] Binary Tree Level Order Traversal  (0) 2022.11.14