본문 바로가기
Algorithm/Data Structure

[자료구조] 트라이(Trie)

by r4bb1t 2023. 5. 18.
반응형

트라이(Trie)는 문자열을 저장하고 빠르게 탐색하기 위해 사용되는 트리 형태의 자료구조입니다.

 

https://csacademy.com/app/graph_editor/

각 노드는 문자를 나타내며, 문자열의 접두사를 공통으로 가지는 경로를 형성합니다.

구현

저는 다음과 같이 구현하였습니다.

#include <bits/stdc++.h>

using namespace std;

typedef struct node {
    char c = '\0';
    bool is_word;
    vector<node *> children;
};

struct Trie {
    node root;

    node *_insert(node *rt, const char *s) {
        if (s[0] == '\0') {
            rt->is_word = true;
            return rt;
        }
        for (node *child : rt->children) {
            if (child->c == s[0]) return _insert(child, &s[1]);
        }
        node *n = new node();
        n->c = s[0];
        rt->children.push_back(n);
        return _insert(n, &s[1]);
    }
    
    node *insert(const char *s) { return _insert(&root, s); }

    node *_search(node *rt, const char *s) {
        if (s[0] == '\0') {
            return rt;
        }
        for (node *child : rt->children) {
            if (child->c == s[0]) {
                return _search(child, &s[1]);
            }
        }
        return NULL;
    }

    node *search(const char *s) {
        node *t = _search(&root, s);
        if (t == NULL || !t->is_word) return NULL;
        return t;
    }

    vector<node *> _prefix_search(node *rt) {
        vector<node *> results;
        if (rt->is_word) results.push_back(rt);
        for (node *child : rt->children) {
            vector<node *> _p = _prefix_search(child);
            results.insert(results.end(), _p.begin(), _p.end());
        }
        return results;
    }
    
    vector<node *> prefix_search(const char *s) {
        node *t = _search(&root, s);
        if (t == NULL) return {};
        return _prefix_search(t);
    }
} trie;

int main() {
    return 0;
}

 

 

반응형

'Algorithm > Data Structure' 카테고리의 다른 글

[자료구조] sparse table  (3) 2020.10.09
[자료구조] 세그먼트 트리(Segment Tree)  (0) 2020.04.14
[자료구조] 큐(Queue)  (0) 2019.11.11
[자료구조] 스택(Stack)  (2) 2019.11.03

댓글