Как реализовать функцию автозаполнения текста с помощью троичного дерева поиска
Для данного набора строк S и строки patt задача состоит в том, чтобы автоматически дополнить строку patt строками из S , имеющими в качестве префикса patt , с использованием троичного дерева поиска. Если ни одна строка не соответствует данному префиксу, выведите «Нет» .
Примеры:
Input: S = {“wallstreet”, “geeksforgeeks”, “wallmart”, “walmart”, “waldomort”, “word”],
patt = “wall”
Output:
wallstreet
wallmart
Explanation:
Only two strings {“wallstreet”, “wallmart”} from S matches with the given pattern “wall”.Input: S = {“word”, “wallstreet”, “wall”, “wallmart”, “walmart”, “waldo”, “won”}, patt = “geeks”
Output: None
Explanation:
Since none of word of set matches with pattern so empty list will be printed.
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Подход Trie: обратитесь к этой статье, чтобы узнать о реализации с использованием структуры данных Trie.
Подход с использованием троичного дерева поиска Для решения проблемы выполните следующие действия:
-  Вставьте все символы строк в S в троичное дерево поиска на основе следующих условий:- Если вставляемый символ меньше текущего значения узла, пройти по левому поддереву.
- Если символ, который нужно вставить, больше, чем текущее значение узла, перейти к правому поддереву.
- Если вставляемый символ совпадает с символом текущего значения узла, пройти по равному поддереву, если оно не является концом слова. Если да, отметьте узел как конец слова.
 
- Используйте аналогичный подход для извлечения предложений.
- Пройдите по дереву, чтобы найти заданный шаблон префикса, следуя той же методике обхода, которая упоминалась выше.
- Если данный префикс не найден, выведите «Нет».
- Если данный префикс найден, перейдите по дереву от узла, на котором префикс заканчивается. Пройдите по левому поддереву и сгенерируйте предложения, за которыми следуют правые и равные поддеревья из каждого узла.
- Каждый раз, когда встречается узел, для которого установлена переменная endofWord , это означает, что предложение было получено. Изложите это предложение словами .
- Верните слова после генерации всех возможных предложений.
Ниже представлена реализация описанного выше подхода:
C ++
| // C++ Program to generate// autocompleted texts from// a given prefix using a// Ternary Search Tree#include <bits/stdc++.h>usingnamespacestd; // Define the Node of the// treestructNode {     // Store the character    // of a string    data;char    // Store the end of    // word    intend;    // Left Subtree    structNode* left;     // Equal Subtree    structNode* eq;     // Right Subtree    structNode* right;}; // Function to create a NodeNode* createNode(charnewData){    structNode* newNode =newNode();    newNode->data = newData;    newNode->end = 0;    newNode->left = NULL;    newNode->eq = NULL;    newNode->right = NULL;    returnnewNode;} // Function to insert a word// in the treevoidinsert(Node** root,            string word,            intpos = 0){     // Base case    if(!(*root))        *root = createNode(word[pos]);     // If the current character is    // less than root's data, then    // it is inserted in the    // left subtree     if((*root)->data > word[pos])        insert(&((*root)->left), word,               pos);     // If current character is    // more than root's data, then    // it is inserted in the right    // subtree     elseif((*root)->data < word[pos])        insert(&((*root)->right), word,               pos);     // If current character is same    // as that of the root's data     else{        // If it is the end of word         if(pos + 1 == word.size())            // Mark it as the            // end of word            (*root)->end = 1;         // If it is not the end of        // the string, then the        // current character is        // inserted in the equal subtree         else            insert(&((*root)->eq), word, pos + 1);    }} // Function to traverse the ternary search treevoidtraverse(Node* root,              vector<string>& ret,              char* buff,              intdepth = 0){    // Base case    if(!root)        return;    // The left subtree is    // traversed first    traverse(root->left, ret,             buff, depth);     // Store the current character    buff[depth] = root->data;     // If the end of the string    // is detected, store it in    // the final ans    if(root->end) {        buff[depth + 1] =' |