Diccionario inglés de árbol binario
Experimento 5: Implementación de un pequeño motor de búsqueda de texto (12~15 horas)
[Descripción del problema]
Con el rápido desarrollo de la tecnología de Internet, ¿cómo Encontrar el contenido necesario en datos masivos no sólo es un tema candente para los investigadores: muchas empresas de TI también han lanzado sus propios motores de búsqueda, como Google, Baidu y Bing. El núcleo de un motor de búsqueda es cómo establecer un índice eficaz para las páginas web, a fin de encontrar y hacer coincidir rápidamente las palabras clave de consulta y devolver los resultados de búsqueda a los usuarios de manera oportuna. En este experimento, implemente un árbol de búsqueda binaria de palabras en inglés, busque según las palabras en inglés ingresadas y proporcione la información de posición de la palabra en el documento.
[Propósito experimental]
(1) Dominar el proceso de construcción del árbol de búsqueda binario
(2) Dominar la inserción y eliminación en el nodo del árbol de búsqueda binario; operaciones;
(3) Dominar el orden previo y el recorrido en orden de árboles binarios;
(4) Utilizar árboles de búsqueda binaria para resolver problemas prácticos.
[Contenido experimental y requisitos]
(1) Construya un árbol de búsqueda binario:
①Lea el contenido del archivo y filtre los números arábigos y los símbolos de puntuación. , convierte todas las formas mayúsculas de letras inglesas a minúsculas.
② Construya un árbol de búsqueda binario de palabras en inglés en el orden del alfabeto inglés. Cuando dos palabras en inglés tienen la misma primera letra, se ordenan por la segunda letra, y así sucesivamente.
③ Cree una lista enlazada individualmente para cada palabra en inglés para almacenar la información de posición de la palabra en el documento (es decir, qué palabra está en el documento, el número de secuencia comienza desde 1). Si una palabra aparece varias veces en un documento, la lista vinculada contendrá varios nodos, ordenados en orden ascendente según el orden en que aparece la palabra en el documento (información de posición).
(2) Recorrer el árbol de búsqueda binaria:
(1) Implementar el recorrido de pedido previo del árbol de búsqueda binaria para encontrar la palabra con la mayor frecuencia
<; p>(2) Buscar: ingrese una palabra a buscar y busque la palabra en el árbol de búsqueda binaria de manera transversal por adelantado. Si se puede encontrar la palabra, se mostrará la información de posición de la palabra en el documento original. de lo contrario, se le solicitará que el documento no contenga la palabra buscada;③ Implemente el recorrido de nivel medio del árbol de búsqueda binaria y guarde los resultados del recorrido en un archivo (words.txt). (Requisito: cada palabra ocupa una línea y cada línea registra la palabra, el número de veces que aparece y la información de posición de la palabra en el documento).
(3) Eliminar nodos:
1. Dada una lista de palabras vacías (las palabras vacías se refieren a palabras que no tienen ningún impacto en la búsqueda, como: de, y, a, an, el, etc.), elimine las palabras en el binario árbol de búsqueda en secuencia (no solo elimine nodos, también borre la lista enlazada individualmente que registra información de posición de palabras);
(2) Al buscar, cuando el término de búsqueda ingresado es una palabra vacía, la consulta no realizarse.
[Seleccionado como contenido]
(1) Permitir que se ingresen dos o más palabras a la vez para consulta, es decir, obtener primero la información de posición de estas palabras en el documento y luego analice la información de posición de estas palabras para determinar si aparecen continuamente en el documento original.
(2) Intente leer contenido de varios documentos, crear un árbol de búsqueda binaria y buscar en varios documentos.
# incluir ltiostream gt
# incluir ltstring gt
# incluir ltcstring gt
¿Usar? ¿Espacio de nombres? std
¿Clase? Sistema binario
{Público:
¿Cadena? datos;
int? w;
¿Nodo de árbol binario? * leftchild
BinaryTreeNode? *Niño correcto;
BinaryTreeNode? *Padre;
int? Posición[50];
BinaryTreeNode(String? a, int? Posición)
{
Datos = a;
w = 1;
niño izquierdo = NULL
niño derecho = NULL
padre = NULL
posición[0]=posición;
}
};
¿Clase? BSTree
{Público:
BinaryTreeNode? * raíz
BStree(){ raíz = NULL;}
¿No es válido? Insertar (cadena? a, int? posición);
¿No válido? eliminar(cadena?clave);
BinaryTreeNode? *Buscar(String?key,BinaryTreeNode*amp?pr,BinaryTreeNode?*ampparent);
¿No es válido? en orden (nodo de árbol binario * amp; raíz);
¿No es válido? Libro(BinaryTreeNode * amp root);
};
¿Anulado? en orden(nodo de árbol binario * amp; raíz)
{
if (raíz)
{
en orden(raíz- gt ;hijo izquierdo);
cout lt ltroot- gt;data;
cout lt lt"?" (root- gt; hijo derecho);
}
}
¿No es válido? BSTree: :PreOrder(nodo de árbol binario *&? raíz)
{
if(raíz)
{
cout lt ltroot - gt; data;
cout lt lt"?" (raíz->hijo derecho);
}
}
BinaryTreeNode? *BSTree::Buscar(cadena?clave,BinaryTreeNode*amp?pr,BinaryTreeNode*amp?parent)
{
BinaryTreeNode? * p = raíz;
pr = raíz
mientras(p)
{
Padre = p;
if(key lt;p->;data)
{
pr = p;
p = p- gt; leftchild
}
¿Y si? if(key gt;p->;data)
{
pr = p;
p = p- gt;niño correcto;
}
Otro
¿Devolver? p;
}
¿Volver? NULL
}
¿No es válido? BSTree::Insert(String? a, int? position)
{
BinaryTreeNode? *pr, *p, *pp = NULL
p=Buscar(a, pr, PP);
if (p!=null)
{
p->w;
p->pos[p->w-1]= posición;
Retorno;
}
¿Nodo de árbol binario? * r = nuevo? BinaryTreeNode(a, posición);
If (! root)
root = r;
¿Y si? if (a ltPP- gt; datos)
PP- gt; hijo izquierdo = r
Otro
PP- hijo derecho = r;
}
¿Anulado? BSTree::Delete(String?Key)
{
¿Nodo de árbol binario? *p, *pr, *pp
p = buscar (clave, pp, pr
if (p==NULL)
Return <; /p>
Si (p->niño izquierdo ampp->niño derecho)
{
BinaryTreeNode? * s = p- gt;niñoderecho, * PS = p;
mientras(s->;niñoizquierdo)
{
PS = s;< / p>
s = s-gt; hijo izquierdo
}
p->; datos = s-gt;
p->; w = s- gt;w;
for(int?I = 0;ilts- gt;w;i)
{
p- >; pos[I]= s- gt;pos[I];
}
pp = ps
p = s;
}
If (p->; leftchild)
{
If (PP- gt; leftchild==p)
{
PP- gt; hijo izquierdo = p- gt; hijo izquierdo
p->;
Otros
{
PP- gt; hijo derecho = p- gt; hijo izquierdo
p->;
}
}
¿Y si? if(p->;rightchild)
{
if(PP- gt;leftchild==p)
{
PP- gt; hijo izquierdo = p- gt; hijo derecho
p->; >Otro
{
PP- gt;niño derecho = p- gt;niño correcto;
p->;niño derecho->;padre = pp
}
}
Otro
{
if (PP- gt; leftchild==p)
PP- gt; leftchild = NULL
Otro
PP- gt; rightchild = NULL
}
¿Eliminar? p;
}
¿Cadena? Palabra(int?i)
{
¿Cadena? palabra[9]=
{"uno", "uno", "y",
"es", "es", "el",
"de","fueron","fueron",
};
¿Volver? palabra[I];
}
int? main()
{
BSTree? *Árbol de búsqueda=¿nuevo? BSTree
¿Carácter? ch;
¿Cadena? cadena
int? I = 2;
int? pos = 1;
mientras(cin.get(ch))
{
if(ch gt; = ' a ' amp ampch lt='z ')
{
str.insert(str.end(), ch);
I = 0;
}
Otro
{
if(ch gt;= ' A ' amp ampch lt='Z ')
{
str.insert(str.end(), char(ch 32));
I = 0;
}
Otro p> p>
{
if (i==0)
{
Árbol de búsqueda - gt; insert(cadena, posición);
p>pos;
str.erase(str.begin(),str.end());
}
i ;
p>
}
}
if(ch=='# ')
Romper;
}
Buscar árbol-gt;InOrder(búsqueda árbol-gt;root);
for(int?k = 0;k lt9;k)
{
Árbol de búsqueda - gt; eliminar(palabra(k));
}
Árbol de búsqueda - gt;subscribe(árbol de búsqueda - > raíz);
¿Cadena? abc
cout lt lt"Ingrese los caracteres que está buscando:";
BinaryTreeNode? *q, *p, *s;
Y (CIN gt; gtabc)
{
p = árbol de búsqueda- gt; , s);
Si (p!=null)
{
cout lt ltabc lt lt" aparece en el texto
El grado es: "
cout lt lt" Sus posiciones son: ";
for(int?j = 0;j ltp->;w;j)
{
cout lt ltp->;pos[j] lt;lt"?";
}
}
Otro
cout lt lt"¡Esta cadena no está en el texto! ";
cout lt ltendl
cout lt lt"Ingrese los caracteres que está buscando: ";
}
}