Aplicación del árbol de diccionario
En este problema, podemos utilizar árboles de enumeración de matrices, hash y diccionario para construir primero un árbol de palabras familiar y luego leerlos en el artículo para compararlos. Este método es relativamente eficaz. Dados n nombres en inglés diferentes que constan de una sola palabra, le permite generarlos en orden lexicográfico de menor a mayor.
Ordenar por árbol de diccionario y crear árbol de diccionario por matriz. Obviamente, todos los nodos secundarios de cada nodo de este árbol están ordenados según el tamaño alfabético. Primero atraviesa el árbol. # incluir ltcstring gt # incluir ltiostream gt # incluir ltconio.h gtusingnamespacestdnamespacetrie{templateltclassT, size_tCHILD_MAX gt/* parámetro t: tipo de datos reservados. Parámetros child_MAX: Tamaño del conjunto de punteros al nodo secundario. */struct nod { t servido; nod ltt, NIÑO _ MAX gt* NIÑO [NIÑO _ MAX]; nod () { memset (esto, 0, tamaño de * esto } ~ nod () { para (unsignedi = 0; i ltCHILD _ MAXi ) eliminar hijo [I]; } recorrido vacío (char * str, unsignedindex) { unsignedi; for (I = 0; i lt index; i) cout lt ltstr [I]; ; ltreservedlt ltendlfor(I = 0; I ltCHILD _ MAXi) { if (child[I]) { str[index] = I; child[I]- gt; ; Plantilla ltclassT, size_tCHILD_MAX=127gt. /* parámetro t: tipo de dato reservado. Parámetros child_MAX: Tamaño del conjunto de punteros al nodo secundario. */class trie { privado: nod ltt; t, CHILD _ MAX gt root; cuenta pública: nod ltt, CHILD _ MAX gt* AddStr (char * str nod, CHILD _ MAX gt* buscar str (char * str); ); booldeletstr (char * str); recorrido vacío () { charstr [100];
Traverse (str, 0); plantilla ltclassT, size_tCHILD_MAX gt nod ltt, CHILD_MAX gt* trie ltt, CHILD_MAX gt* AddStr (char * str) { nod lt, CHILD_MAX gt * ahora = amp root; (ahora- gt; niño [* str] == NULL) ahora- gt; niño [* str] = newnod lt; CHILD_MAX gt ahora = ahora- gt; )!='\0');returnnow} plantilla ltclassT, size_tCHILD_MAX gt nod ltt, CHILD_MAX gt* trie ltt, CHILD_MAX gt* find str (char * str) { nod lt, CHILD_MAX gt* ahora = amp root; { if (now- gt; child [* str] == NULL) return NULL; ahora = now- gt; child [* str】;} while (*(str)!='\0'); ,size_tCHILD_MAX gtbooltrie ltt,CHILD_MAX gt* DeleteStr(char *str){ nod lt;t,CHILD_ MAX gt* * nods = newnod ltt, CHILD_MAX gt*[strlen(str)]; * ahora = amp root; ]; } while (* (str)! = '\0'); snods-; while (s nods gt; 0) { for (unsignedi = 0; i ltCHILD _ MAXi ) if (snods] - gt; niño [i] ! = NULL) devuelve verdadero; eliminar asentimientos [s asentimientos]; asentir [-snods] - gt; hijo [*(-str)] = } returntrue} } int main() { //TestProgramtrie:: trie lt; int gt tree; while(1) { cout lt1 para agregar cadena lt; ltendlcout lt lt3fordeleteasterring lt.
ltendlcout lt lt4fortraversallt ltendlcout lt lt5forexitlt ltendlcharstr[100]; switch(getch()) { case '1': CIN getline(str, 100); AddStr(str)-》;reservadolt;ltTimes. lt ltendl break; caso '2': cin.getline(str, 100); trie::nod ltint, 127》*find; FindStr(cadena); si (!find) cout lt no se encuentra. lt ltendlsecout lt ltEsta picadura ha existido para lt ltFind->Reserved lt ltTimes. lt ltendl se rompe; caso '3': cin .getline(str, 100); cout lt lt la acción es lt lt(tree.DeleteStr(str)? Éxito.: Sin éxito.) lt ltendl se rompe; atravesar(); romper; caso "5": devolver 0;