Menu
Coddy logo textTech

삭제

Coddy의 트라이 - 자료구조 시리즈 #8 코스 레슨 — 14개 중 8번째.

트라이(trie)에서 삭제하는 과정은 두 부분으로 나뉩니다. 간단한 부분: 단어의 끝 노드를 찾아 isEndOfWord를 다시 false로 설정합니다. 그 후에는 search에 의해 해당 단어가 더 이상 보고되지 않으며, 이것이 사용자가 중요하게 생각하는 부분입니다.

더 까다로운 부분: 이제 쓸모없어진 노드들을 정리(prune)하는 것입니다. 자식 노드가 자체적인 자식이 없고 다른 단어의 끝도 아니라면 그 노드는 쓸모가 없습니다. 즉, 향후 어떤 검색이나 접두사 순회(prefix walk)로도 도달할 수 없습니다. 재귀적으로 내려갔다가 다시 올라오면서 이러한 노드들을 찾아 제거합니다.

두 가지 경우에 주의하세요. 삽입된 적이 없는 단어를 삭제하려고 하면 아무것도 하지 마세요. 삭제하려는 단어가 저장된 다른 단어의 접두사인 경우(예: "card"도 트라이에 있을 때 "car"를 삭제하는 경우), 플래그는 지워야 하지만 모든 노드는 유지해야 합니다. 해당 노드들은 여전히 "card"를 통해 접근 가능하기 때문입니다.

challenge icon

챌린지

중급

Trie 클래스에 delete 메서드를 추가하세요.

이 메서드는 문자열 word를 인자로 받습니다:

  • 만약 word가 트라이에 저장되어 있다면, 해당 단어의 끝 노드 표시를 해제하고(isEndOfWord = false), 그 과정에서 더 이상 필요 없는 노드들(자식 노드가 없고 다른 단어의 끝도 아닌 노드들)을 제거합니다.
  • 만약 word가 트라이에 없다면, 아무것도 하지 않습니다.

노드를 정리하는 깔끔한 구현 방법은 현재 자식 노드를 삭제할 수 있는지 여부를 호출자에게 불리언 값으로 반환하는 재귀 헬퍼 함수를 사용하는 것입니다.

직접 해보기

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "trie.h"

int main() {
    Trie t;
    Trie_init(&t);
    char line[1024];
    while (fgets(line, sizeof(line), stdin)) {
        line[strcspn(line, "\r\n")] = '\0';
        char* cmd = strtok(line, " \t");
        if (!cmd) continue;
        if (strcmp(cmd, "rootIsEmpty") == 0) { printf("%s\n", TrieNode_childrenCount(t.root) == 0 ? "true" : "false"); }
        if (strcmp(cmd, "hasChild") == 0) { char* arg = strtok(NULL, " \t"); if (arg) printf("%s\n", t.root->children[(unsigned char)arg[0]] != NULL ? "true" : "false"); }
        if (strcmp(cmd, "insert") == 0) { char* arg = strtok(NULL, " \t"); if (arg) Trie_insert(&t, arg); }
        if (strcmp(cmd, "search") == 0) { char* arg = strtok(NULL, " \t"); if (arg) printf("%s\n", Trie_search(&t, arg) ? "true" : "false"); }
        if (strcmp(cmd, "startsWith") == 0) { char* arg = strtok(NULL, " \t"); if (arg) printf("%s\n", Trie_startsWith(&t, arg) ? "true" : "false"); }
        if (strcmp(cmd, "delete") == 0) { char* arg = strtok(NULL, " \t"); if (arg) Trie_delete(&t, arg); }
    }
    return 0;
}

트라이 - 자료구조 시리즈 #8의 모든 레슨