알고리즘 문제 풀이

[LeetCode] 1008. Construct Binary Search Tree from Preorder Traversal

_OB1N 2021. 10. 14. 10:33

문제 출처: https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/

 

Construct Binary Search Tree from Preorder Traversal - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com


문제

BST(이진 탐색 트리)를 전위 순회한 결과 배열이 주어지면, 트리를 만들고 그 루트 노드를 반환하라.

 

주어진 테스트 케이스에는 항상 가능한 이진 탐색 트리를 찾을 수 있음이 보장된다.

예제

Input: preorder = [8,5,1,7,10,12]
Output: [8,5,10,1,7,null,12]
Input: preorder = [1,3]
Output: [1,null,3]

풀이

이 문제는 정복 분할(Divid and Conquer) 방식으로 접근할 수 있습니다.

 

전위 순회의 특성으로 결과 배열의 첫 번째 인덱스의 값은 최상위 루트가 됩니다. 이 값을 기준으로 나머지 값들을 이진 탐색 트리의 기준에 맞게 두 파트(root보다 작은 값, root보다 큰 값)로 나눌 수 있습니다.

이렇게 나뉜 두 파트에 대해서 각각 이전과 마찬가지로 첫 번째 값은 루트로 하고 나머지를 두 부분으로 나누는 과정을 반복할 수 있습니다.

 

전체 과정을 그림으로 표현하면 아래와 같습니다. 각 단계에서 root로 설정되는 값만 추출하게 되면 예제에서 보여주는 이진 탐색 트리의 모습과 동일한 것을 알 수 있습니다.

이러한 과정을 코드로 작성하면 다음과 같습니다.

var bstFromPreorder = function(preorder) {
    let answer = null;
    
    function buildTree(arr) {
        if (arr.length == 0) { return null; }
        
        const left = arr.filter(val => val < arr[0]);
        const right = arr.filter(val => val > arr[0]);
        
        return new TreeNode(arr[0], buildTree(left), buildTree(right));
    }
    
    answer = buildTree(preorder);

    return answer;
};

알고리즘의 시간 복잡도를 계산하면, buildTree(arr)는 한번 호출할 때마다 매개변수로 주어지는 arr을 탐색해야 하므로 $O(n)$의 시간이 걸립니다. 이 buildTree(arr)이 preorder의 길이만큼 호출되기 때문에 전체 시간 복잡도는 $O(n^2)$이라 할 수 있습니다. 

 

Github: 1008.js

 

GitHub - opwe37/Algorithm-Study

Contribute to opwe37/Algorithm-Study development by creating an account on GitHub.

github.com