Diseñar un pequeño diccionario inglés-chino usando C++
Este árbol se utiliza específicamente para implementar diccionarios. Pero la operación de eliminación del árbol trie es más problemática. Se pueden implementar árboles de búsqueda binarios y pueden ser muy rápidos. El árbol AVL es simplemente un árbol binario equilibrado y no existe una mejora objetiva de la velocidad en las aplicaciones de diccionario porque los diccionarios no producen árboles binarios extremos (listas vinculadas).
El siguiente es el código para mi árbol de búsqueda binaria. La ventaja de un árbol de búsqueda binario es que es fácil de implementar y su recorrido ordenado no se genera simplemente en orden alfabético.
//Árbol de búsqueda binaria, no autoequilibrado
//Autor: Zhang Qingxing, 28 de diciembre de 2009. Preparándose para una entrevista en Google
# include & ltiostream & gt
Usando el espacio de nombres std
Estructura BST
{
int data;
BST * izquierda
BST *derecha;
};
//Tiempo de ejecución: promedio O (logn ), peor caso O(n)
Búsqueda booleana (BST * & amproot, int key) //Si la clave no existe, devuelve false
{
if(root==NULL)
Devuelve false
if(key<root->data)
Devuelve búsqueda( root->left , clave);
else if(key>root->data)
devolver búsqueda(root->right, Key);
Otros
Devuelve verdadero
}
//Tiempo de ejecución: promedio O(logn), peor caso O (n)
Inserción booleana ( BST * & amproot, int key) //Si la clave ya existe, devuelve false
{
if(root= =NULL)
{ p>
BST *nodo =nuevo BST;
Nodo->; datos = clave;
Nodo-> ; izquierda = nodo-& gt; /p>
raíz = nodo;
devuelve verdadero
}
si no (clave<raíz->datos)
return insert(root->left, key);
else if(key>root-> data)
Return insert(root->right, key) ;
Otro
Devuelve falso
}
//Tiempo de ejecución: promedio O(logn), peor caso O(n)
Boolean delete(BST * & amproot, int key) //Devuelve false si la clave no existe.
{
if(root == NULL)//No existe tal clave
Devuelve falso
else if(key & lt ;root->data)
return remove(root->left, key);
si no(key>root->data)
return remove(root-& gt; sí, clave);
else//encontrar el nodo
{
if((root -> left == NULL)&&(root->right == NULL))//Sin nodo secundario (nodo hoja)
{
BST * tmp = root
root = NULL
Eliminar tmp
}
else if((root-& gt; left = = NULL)| |(root-> right = = NULL))//un niño
{
BST * tmp = root
if(root ->left==NULL) p>
root = root->right;
Otro
root = root->left;
Eliminar tmp
}
else//dos hijos: Reemplace el valor del nodo con el sucesor ordenado y elimine el nodo
{
BST * tmp = root-& gt; derecha;
mientras(tmp->;izquierda!=null)
tmp = tmp-& gt; >data;
eliminar(root, tmpdata);
root->data = tmpdata
p>
}
Devuelve verdadero
}
}
//Tiempo de ejecución: O(n)
pedido anulado (BST * & amp; nodo)
{
if (nodo!=null)
{
en orden(nodo-& gt; izquierda );
cout & lt& ltnode->;data& lt& lt" ";
en orden(nodo-& gt; derecha );
} p>
}
//Tiempo de ejecución: O(n)
Reserva no válida (BST* y nodo amp)
{
if (nodo! =null)
{
cout<<node->data<<" "
suscripción(nodo->izquierda)
Suscripción(nodo-> par);
}
}
//Tiempo de ejecución: O(n)
Orden de publicación no válida (BST * y nodo amp )
{
if (nodo!=null)
{
Postorder(nodo->izquierda);
Postorder(nodo->right);
cout<<node->datos<<" ";
}
}
int main()
{
bool b;
BST * raíz = NULL
b = insertar(raíz, 1
b = insertar(raíz, 3);
b = insertar(raíz, 7);
b = insertar(raíz, 5
b = insertar(raíz, 77); p>
p>
b = insertar(raíz, 10);
b = insertar(raíz, 4);
b = insertar(raíz, 13)
//Ordenado
cout & lt& lt"En orden:";
inorder(root);
cout & lt& ltendl
//Reserva
cout & lt& lt"Reserva:";
Reserva (raíz);
cout & lt& ltendl
//Pedido posterior
cout & lt& lt"Pedido posterior:";
Orden posterior (raíz);
cout & lt& ltendl
//Buscar 7
if(buscar(raíz, 7))
cout & lt& lt"¡Encontramos 7!"& lt& ltendl
Otro
cout & lt& lt"7 no existe!"& lt& ltendl
b = remove(root, 7);
cout & lt& lt"-"& ltendl
//Ordenado
cout & lt& lt"En orden:";
inorder(root);
cout & lt& ltendl
//Reserva
cout & lt& lt"Reserva:";
Reserva (root) ;
cout & lt& ltendl
//Pedido posterior
cout & lt& lt"Pedido posterior:";
Pedido posterior ( root) ;
cout & lt& ltendl
if(search(root, 7))
cout & lt& lt"¡Encontramos 7!"& lt& ltendl
p>Otro
cout & lt& lt"7 no existe!"& lt& ltendl
Devuelve 0;
} p>