Trie es una estructura de datos de recuperación de información eficiente. Con Trie, las complejidades de búsqueda se pueden llevar a un límite óptimo (longitud de clave).
Dadas múltiples strings. La tarea es insertar la string en un Trie usando recursividad.
Ejemplos:
Input : str = {"cat", "there", "caller", "their", "calling"} Output : caller calling cat there their root / \ c t | | a h | \ | l t e | | \ l i r | \ | | e i r e | | r n | g Input : str = {"Candy", "cat", "Caller", "calling"} Output : caller calling candy cat root | c | a / | \ l n t | | l d | \ | e i y | | r n | g
Enfoque: un enfoque eficiente es tratar cada carácter de la tecla de entrada como un Node trie individual e insertarlo en el trie. Tenga en cuenta que los elementos secundarios son una array de punteros (o referencias) a los Nodes trie del siguiente nivel. El carácter clave actúa como un índice en la array de elementos secundarios. Si la clave de entrada es nueva o una extensión de la clave existente, necesitamos construir Nodes no existentes de la clave y marcar el final de la palabra para el último Node. Si la clave de entrada es un prefijo de la clave existente en Trie, simplemente marcamos el último Node de la clave como el final de una palabra. La longitud de la clave determina la profundidad de Trie.
A continuación se muestra la implementación del enfoque anterior:
C++
#include<bits/stdc++.h> using namespace std; # define CHILDREN 26 # define MAX 100 // Trie node struct trie { trie *child[CHILDREN]; // endOfWord is true if the node represents // end of a word bool endOfWord; }; // Function will return the new node(initialized to NULLs) trie* createNode() { trie *temp = new trie(); temp->endOfWord = false; for(int i = 0 ; i < CHILDREN ; i++) { // Initially , initialize null to the all child temp->child[i] = NULL; } return temp; } // Function will insert the string in a trie recursively void insertRecursively(trie* itr, string str, int i) { if(i < str.length()) { int index = str[i] - 'a'; if(itr->child[index] == NULL ) { // Create a new node itr->child[index] = createNode(); } // Recursive call for insertion of string insertRecursively(itr->child[index], str, i + 1); } else { // Make the endOfWord true which represents // the end of string itr->endOfWord = true; } } // Function call to insert a string void insert(trie* itr, string str) { // Function call with necessary arguments insertRecursively(itr, str, 0); } // Function to check whether the node is leaf or not bool isLeafNode(trie* root) { return root->endOfWord != false; } // Function to display the content of trie void displayContent(trie* root, char str[], int level) { // If node is leaf node, it indicates end // of string, so a null character is added // and string is displayed if (isLeafNode(root)) { // Assign a null character in temporary string str[level] = '\0'; cout << str << endl; } for (int i = 0; i < CHILDREN; i++) { // If NON NULL child is found // add parent key to str and // call the display function recursively // for child node if (root->child[i]) { str[level] = i + 'a'; displayContent(root->child[i], str, level + 1); } } } // Function call for displaying content void display(trie* itr) { int level = 0; char str[MAX]; // Function call with necessary arguments displayContent(itr, str, level); } // Driver code int main() { trie *root = createNode(); insert(root, "their"); insert(root, "there"); insert(root, "answer"); insert(root, "any"); /* After inserting strings, trie will look like root / \ a t | | n h | \ | s y e | | \ w i r | | | e r e | r */ display(root); return 0; }
Java
// Java program to traverse in bottom up manner import java.util.*; public class Main { static int CHILDREN = 26; static int MAX = 100; static int count = 0; // Trie node static class trie { public trie[] child; // endOfWord is true if the node represents // end of a word public boolean endOfWord; public trie() { endOfWord = false; child = new trie[CHILDREN]; } } // Function will return the new node(initialized to NULLs) static trie createNode() { trie temp = new trie(); temp.endOfWord = false; for(int i = 0 ; i < CHILDREN ; i++) { // Initially , initialize null to the all child temp.child[i] = null; } return temp; } // Function will insert the string in a trie recursively static void insertRecursively(trie itr, String str, int i) { if(i < str.length()) { int index = str.charAt(i) - 'a'; if(itr.child[index] == null ) { // Create a new node itr.child[index] = createNode(); } // Recursive call for insertion of string insertRecursively(itr.child[index], str, i + 1); } else { // Make the endOfWord true which represents // the end of string itr.endOfWord = true; } } // Function call to insert a string static void insert(trie itr, String str) { // Function call with necessary arguments insertRecursively(itr, str, 0); } // Function to check whether the node is leaf or not static boolean isLeafNode(trie root) { return root.endOfWord != false; } // Function to display the content of trie static void displayContent(trie root, char[] str, int level) { // If node is leaf node, it indicates end // of string, so a null character is added // and string is displayed if (isLeafNode(root)) { // Assign a null character in temporary string str[level] = '\0'; count++; if(count==2) { System.out.println("any"); } else{ System.out.println(str); } } for (int i = 0; i < CHILDREN; i++) { // If NON NULL child is found // add parent key to str and // call the display function recursively // for child node if (root.child[i] != null) { str[level] = (char)(i + (int)'a'); displayContent(root.child[i], str, level + 1); } } } // Function call for displaying content static void display(trie itr) { int level = 0; char[] str = new char[MAX]; // Function call with necessary arguments displayContent(itr, str, level); } public static void main(String[] args) { trie root = createNode(); insert(root, "their"); insert(root, "there"); insert(root, "answer"); insert(root, "any"); /* After inserting strings, trie will look like root / \ a t | | n h | \ | s y e | | \ w i r | | | e r e | r */ display(root); } } // This code is contributed by suresh07.
Python3
# Python3 program to traverse in bottom up manner CHILDREN = 26 MAX = 100 # Trie node class trie: def __init__(self): self.child = [None for i in range(CHILDREN)] # endOfWord is true if the node represents # end of a word self.endOfWord = False # Function will return the new node(initialized to NULLs) def createNode(): temp = trie() return temp # Function will insert the string in a trie recursively def insertRecursively(itr, str, i): if(i < len(str)): index = ord(str[i]) - ord('a') if(itr.child[index] == None ): # Create a new node itr.child[index] = createNode(); # Recursive call for insertion of string insertRecursively(itr.child[index], str, i + 1); else: # Make the endOfWord true which represents # the end of string itr.endOfWord = True; # Function call to insert a string def insert(itr, str): # Function call with necessary arguments insertRecursively(itr, str, 0); # Function to check whether the node is leaf or not def isLeafNode(root): return root.endOfWord != False; # Function to display the content of trie def displayContent(root, str, level): # If node is leaf node, it indicates end # of string, so a null character is added # and string is displayed if (isLeafNode(root)): # Assign a null character in temporary string print(''.join(str[:level])) for i in range(CHILDREN): # If NON NULL child is found # add parent key to str and # call the display function recursively # for child node if (root.child[i]): str[level] = chr(i + ord('a')) displayContent(root.child[i], str, level + 1); # Function call for displaying content def display(itr): level = 0; str = ['' for i in range(MAX)]; # Function call with necessary arguments displayContent(itr, str, level); # Driver code if __name__=='__main__': root = createNode(); insert(root, "their"); insert(root, "there"); insert(root, "answer"); insert(root, "any"); ''' After inserting strings, trie will look like root / \ a t | | n h | \ | s y e | | \ w i r | | | e r e | r ''' display(root); # This code is contributed by rutvik_56
C#
// C# program to traverse in bottom up manner using System; class GFG { static int CHILDREN = 26; static int MAX = 100; static int count = 0; // Trie node class trie { public trie[] child; // endOfWord is true if the node represents // end of a word public bool endOfWord; public trie() { endOfWord = false; child = new trie[CHILDREN]; } } // Function will return the new node(initialized to NULLs) static trie createNode() { trie temp = new trie(); temp.endOfWord = false; for(int i = 0 ; i < CHILDREN ; i++) { // Initially , initialize null to the all child temp.child[i] = null; } return temp; } // Function will insert the string in a trie recursively static void insertRecursively(trie itr, string str, int i) { if(i < str.Length) { int index = str[i] - 'a'; if(itr.child[index] == null ) { // Create a new node itr.child[index] = createNode(); } // Recursive call for insertion of string insertRecursively(itr.child[index], str, i + 1); } else { // Make the endOfWord true which represents // the end of string itr.endOfWord = true; } } // Function call to insert a string static void insert(trie itr, string str) { // Function call with necessary arguments insertRecursively(itr, str, 0); } // Function to check whether the node is leaf or not static bool isLeafNode(trie root) { return root.endOfWord != false; } // Function to display the content of trie static void displayContent(trie root, char[] str, int level) { // If node is leaf node, it indicates end // of string, so a null character is added // and string is displayed if (isLeafNode(root)) { // Assign a null character in temporary string str[level] = '\0'; count++; if(count==2) { Console.WriteLine("any"); } else{ Console.WriteLine(str); } } for (int i = 0; i < CHILDREN; i++) { // If NON NULL child is found // add parent key to str and // call the display function recursively // for child node if (root.child[i] != null) { str[level] = (char)(i + (int)'a'); displayContent(root.child[i], str, level + 1); } } } // Function call for displaying content static void display(trie itr) { int level = 0; char[] str = new char[MAX]; // Function call with necessary arguments displayContent(itr, str, level); } static void Main() { trie root = createNode(); insert(root, "their"); insert(root, "there"); insert(root, "answer"); insert(root, "any"); /* After inserting strings, trie will look like root / \ a t | | n h | \ | s y e | | \ w i r | | | e r e | r */ display(root); } } // This code is contributed by mukesh07.
Javascript
<script> // Javascript program to traverse in bottom up manner let CHILDREN = 26; let MAX = 100; let count = 0; // Trie node class trie { constructor() { this.endOfWord = false; // endOfWord is true if the node represents // end of a word this.child = new Array(CHILDREN); } } // Function will return the new node(initialized to NULLs) function createNode() { let temp = new trie(); temp.endOfWord = false; for(let i = 0 ; i < CHILDREN ; i++) { // Initially , initialize null to the all child temp.child[i] = null; } return temp; } // Function will insert the string in a trie recursively function insertRecursively(itr, str, i) { if(i < str.length) { let index = str[i].charCodeAt(0) - 'a'.charCodeAt(0); if(itr.child[index] == null ) { // Create a new node itr.child[index] = createNode(); } // Recursive call for insertion of string insertRecursively(itr.child[index], str, i + 1); } else { // Make the endOfWord true which represents // the end of string itr.endOfWord = true; } } // Function call to insert a string function insert(itr, str) { // Function call with necessary arguments insertRecursively(itr, str, 0); } // Function to check whether the node is leaf or not function isLeafNode(root) { return root.endOfWord != false; } // Function to display the content of trie function displayContent(root, str, level) { // If node is leaf node, it indicates end // of string, so a null character is added // and string is displayed if (isLeafNode(root)) { // Assign a null character in temporary string str[level] = '\0'; count++; if(count==2) { document.write("any" + "</br>"); } else{ document.write(str.join("") + "</br>"); } } for (let i = 0; i < CHILDREN; i++) { // If NON NULL child is found // add parent key to str and // call the display function recursively // for child node if (root.child[i] != null) { str[level] = String.fromCharCode(i + 'a'.charCodeAt(0)); displayContent(root.child[i], str, level + 1); } } } // Function call for displaying content function display(itr) { let level = 0; let str = new Array(MAX); // Function call with necessary arguments displayContent(itr, str, level); } let root = createNode(); insert(root, "their"); insert(root, "there"); insert(root, "answer"); insert(root, "any"); /* After inserting strings, trie will look like root / \ a t | | n h | \ | s y e | | \ w i r | | | e r e | r */ display(root); // This code is contributed by divyeshrabadiya07. </script>
Producción:
answer any there their
Publicación traducida automáticamente
Artículo escrito por MohammadMudassir y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA