Coding/자료구조

[자료구조] 트라이

ryureeru 2022. 10. 8. 20:33

트라이 (Trie)

 

  • 문자열을 저장하고 빠르게 탐색하기 위한 트리 형태의 자료구조
  • 문자열 저장을 위한 메모리가 필요하지만 탐색이 so fast
  • 정렬된 트리 구조

 

 

class Node {
    HashMap<Character, Node> child;
    boolean isTerminal;

    public Node(){
        this.child = new HashMap<>();
        this.isTerminal = false;
    }
}

 

 

 

1. 삽입

 

public void insert(String str) {
    Node cur = this.root;

    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);

        if (!cur.child.containsKey(c)) { // key가 없으면
            cur.child.put(c, new Node()); // 새 노드 넣기
        }

        cur = cur.child.get(c);

        if (i == str.length() - 1) {
            cur.isTerminal = true;
            return;
        }

    }
}

 

 

2. 탐색

 

public boolean search(String str) {
    Node cur = this.root;

    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);

        if (cur.child.containsKey(c)) {
            cur = cur.child.get(c);
        } else {
            return false;
        }

        if (i == str.length() - 1) {
            if (!cur.isTerminal) {
                return false;
            }
        }

    }
    return true;
}

 

 

3. 삭제

 

public void delete(String str) {
    boolean ret = this.delete(this.root, str, 0);
    if (ret) {
        System.out.println("삭제 완료");
    } else {
        System.out.println("존재하지 않는 단어");
    }

}

public boolean delete(Node node, String str, int idx) {
    char c = str.charAt(idx);

    if(!node.child.containsKey(c)) {
        return false;
    }

    Node cur = node.child.get(c);
    idx++;

    if (idx == str.length()) {
        if (!cur.isTerminal) {
            return false;
        }

        cur.isTerminal = false;

        if (cur.child.isEmpty()) {
            node.child.remove(c);
        }
    } else {
        if (!this.delete(cur, str, idx)) { // false면
            return false;
        }

        if (!cur.isTerminal && cur.child.isEmpty()) {
            node.child.remove(c);
        }

    }

    return true;
}

 

 

'Coding > 자료구조' 카테고리의 다른 글

[자료구조] PriorityQueue  (1) 2022.10.08
[자료구조] Heap  (0) 2022.10.08
[자료구조] 그래프 탐색  (0) 2022.10.02
[자료구조] AVL 트리  (0) 2022.10.02
[자료구조] 이진 트리의 순회  (0) 2022.10.01