PS/PS Log

23.08.05. 풀었던 문제들 복기

hyelie 2023. 8. 5. 20:41

Leetcode 95. Unique Binary Search Trees II

 unique한 binary tree를 어떻게 만들지 ? ... 라고 생각하면.

 

dp(start, end) = for all i in [start, end], dp[start, i-1] + dp[i+1, end]

 

로 풀면 된다.

 

 이게 무슨 말이냐?

 start ~ end 사이에 있는 어떤 i를 root로 두고, 그 start ~ i-1은 왼쪽 subtree에, i+1 ~ right는 오른쪽 subtree에 넣는 DP라는 말이다.

 

 그러면, left subtree와 right subtree의 cartesian product하면 모든 가능한 결과가 나온다.

 

// Runtime 16 ms Beats 75.53%
// Memory 16.1 MB Beats 56.82%

class Solution {
public:
    vector<TreeNode*> build(int start, int end){
        vector<TreeNode*> result;
        if(start > end){
            result.push_back(NULL);
            return result;
        }

        for(int i = start; i<=end; i++){
            vector<TreeNode*> left = build(start, i-1);
            vector<TreeNode*> right = build(i+1, end);

            for(int j = 0; j<left.size(); j++){
                for(int k = 0; k<right.size(); k++){
                    TreeNode* parent = new TreeNode(i);
                    parent->left = left[j];
                    parent->right = right[k];
                    result.push_back(parent);
                }
            }
        }

        return result;
    }
    vector<TreeNode*> generateTrees(int n) {
        return build(1, n);
    }
};