Tìm kiếm
Bài học 6 trên 14 trong khóa học Cây tiền tố, chuỗi cấu trúc dữ liệu số 8 của Coddy.
Tìm một từ là thao tác ngược lại với chèn: đi từ nút gốc xuống từng ký tự một, theo các nút con khớp với từng ký tự. Nếu tại bất kỳ thời điểm nào, nút hiện tại không có nút con ứng với ký tự tiếp theo, từ đó không có trong trie và ta có thể trả về false ngay.
Nếu đi qua được mọi ký tự, ta sẽ đến một nút. Câu trả lời phụ thuộc vào giá trị cờ isEndOfWord của nút đó. Đây là điểm khác biệt quan trọng: sau khi chèn "car", đường đi cho "ca" đã có trong trie, nhưng search("ca") vẫn phải trả về false vì chưa có ai đánh dấu nút đó là điểm kết thúc một từ.
Thử thách
DễThêm một phương thức search vào lớp Trie.
Phương thức này nhận một chuỗi word và trả về:
truenếuwordđã được thêm vào trie trước đó.falsetrong các trường hợp còn lại, bao gồm khi chỉ có tiền tố củawordtồn tại hoặc chỉ lưu một từ dài hơn bắt đầu bằngword.
Tự làm thử
#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"); }
}
return 0;
}
Tất cả bài học trong Cây tiền tố, chuỗi cấu trúc dữ liệu số 8
Tự luyện tập: Trình biên dịch C online