record logo record

트라이란?

※참고※
문자열을 다루는 작업은 정수나 실수 등의 다른 자료형을 다루는 것과 다르다. 정수나 실수형 변수는 그 크기가 항상 정해져 있기 때문에 비교에 상수 시간 이 걸린다고 가정해도 되는 반면, 문자열 변수를 비교하는 데는 최악의 경우 문자열의 길이에 비례하는 시간이 걸리기 때문입니다.

트라이 특징

트라이 예시

아래 그림은 문자열 집합 arr={“BE”,”BET”,”BUS”,”TEA”,”TEN”}를 저장하는 트라이 예시입니다.

trie

트라이 구현 코드

#include <iostream>
#include <string.h>
using namespace std;

const int ALPABETS = 26;
int toNumber(char ch) {
    return ch - 'A';
}
struct TrieNode {
    TrieNode* children[ALPABETS];
    bool terminal;

    TrieNode() : terminal(false) {
        memset(children, 0, sizeof(children));
    }
    ~TrieNode() {
        for (int i = 0; i < ALPABETS; i++) {
            if(children[i]) delete children[i];
        }
    }
    void insert(const char* key) {
        if(*key == 0) {
            terminal = true;
        }
        else {
            int next = toNumber(*key);
            if(children[next] == NULL) {
                children[next] = new TrieNode();
            }
            children[next] -> insert(key+1);
        }
    }
    TrieNode* find(const char* key) {
        if(*key == 0) 
            return this;
        int next = toNumber(*key);
        if(children[next] == NULL) 
            return NULL;
        return children[next] -> find(key+1);
    }
};

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    TrieNode *node = new TrieNode();

    const char* arr[5] = {"BE","BET","BUS","TEA","TEN"};
    const char* findarr[5] = {"B","BE","BU","TEAN","TEN"};
    for (int i = 0; i < 5; i++) {
        node -> insert(arr[i]);  
    }

    for (int i = 0; i < 5; i++) {
        if(node -> find(findarr[i]) != 0) {
            cout << "YES\n";
        } else {
            cout << "NO\n";
        }
    }
    return 0;
}

Reference