Algorithm

LeetCode 501. Find Mode in Binary Search Tree

쿠케캬캬 2023. 11. 2. 20:00
반응형

https://leetcode.com/problems/find-mode-in-binary-search-tree/description/

 

Find Mode in Binary Search Tree - LeetCode

Can you solve this real interview question? Find Mode in Binary Search Tree - Given the root of a binary search tree (BST) with duplicates, return all the mode(s) [https://en.wikipedia.org/wiki/Mode_(statistics)] (i.e., the most frequently occurred element

leetcode.com

 

노드를 두 번 순회하면, 추가 공간 없이 결과를 구할 수 있습니다.

주어진 트리는 이진트리이므로, 트리를 중위순회하여 오름차순으로 모든 노드를 방문할 수 있습니다.

처음 순회할 때, 연속적으로 방문되는 노드가 동일한 값을 가지는 최대 길이를 구해주고,

다음으로 순회할 때, 연속적으로 방문되는 노드의 개수가 최대 길이인 값을 구해줍니다.

class Solution {
public:
    vector<int> findMode(TreeNode* root) {
        int maxLength = findMaxLength(root);
        return findElementsOfLength(root, maxLength);
    }

    int findMaxLength(TreeNode* root) {
        int val = INT_MIN, curLength = 0, maxLength = 1;
        findMaxLength(root, val, curLength, maxLength);
        return max(curLength, maxLength);
    }

    void findMaxLength(TreeNode* node, int& val, int& curLength, int& maxLength) {
        if(!node) return;
        findMaxLength(node->left, val, curLength, maxLength);
        if(node->val != val) {
            maxLength = max(maxLength, curLength);
            val = node->val;
            curLength = 1;
        } else {
            curLength++;
        }
        findMaxLength(node->right, val, curLength, maxLength);
    }

    vector<int> findElementsOfLength(TreeNode* root, int length) {
        vector<int> elements;
        int val = INT_MIN, curLength = 0;
        findElementsOfLength(root, length, val, curLength, elements);
        return elements;
    }

    void findElementsOfLength(TreeNode* node, int length, int& val, int &curLength, vector<int>& elements) {
        if(!node) return;
        findElementsOfLength(node->left, length, val, curLength, elements);
        if(node->val != val) {
            val = node->val;
            curLength = 1;
        } else {
            curLength++;
        }
        if(curLength == length) {
            elements.push_back(node->val);
        }
        findElementsOfLength(node->right, length, val, curLength, elements);
    }
};

 

 

각 value마다 count를 기억해주면, 추가 공간을 사용하여 결과를 구할 수 있습니다.

class Solution {
public:
    unordered_map<int, int> valToLengthMap;
    int maxLength = 0;
    vector<int> findMode(TreeNode* root) {
        preorder(root);
        
        vector<int> res;
        for(auto& p : valToLengthMap) {
            if(p.second == maxLength) res.push_back(p.first);
        }
        return res;
    }

    void preorder(TreeNode* node) {
        if(!node) return;
        maxLength = max(maxLength, ++valToLengthMap[node->val]);
        preorder(node->left);
        preorder(node->right);
    }
};
class Solution {
public:
    unordered_map<int, int> valToLengthMap;
    unordered_map<int, unordered_set<int>> lengthToValuesMap;

    int maxLength = 0;
    vector<int> findMode(TreeNode* root) {
        preorder(root);
        return vector<int>(lengthToValuesMap[maxLength].begin(), lengthToValuesMap[maxLength].end());
    }

    void preorder(TreeNode* node) {
        if(!node) return;
        int& length = valToLengthMap[node->val];
        maxLength = max(maxLength, ++length);
        lengthToValuesMap[length - 1].erase(node->val);
        lengthToValuesMap[length].insert(node->val);
        preorder(node->left);
        preorder(node->right);
    }
};
반응형