Notas de clase: Técnica de búsqueda de la tabla de árbol: Árbol de clasificación binaria (BST)

La búsqueda de tabla lineal es una búsqueda estática. Para realizar una búsqueda dinámica en una tabla lineal, existen los siguientes problemas:
búsqueda dinámica en una tabla de secuencia desordenada, operación de inserción simple, pero alta complejidad de búsqueda.
Búsqueda dinámica en una tabla de secuencia ordenada, Encuentra complejidad del tiempo es bueno, pero la complejidad del tiempo de inserción alta
dinámicas de búsqueda en una sola lista, basta con insertar la operación, pero mira para alta complejidad operativa
solución: el uso de una estructura de datos tal árbol binario, dinámica de búsqueda de
árbol de tipo binario (Binary Árbol de búsqueda) Árbol de
clasificación binaria (también llamado árbol de búsqueda binaria) : un árbol binario vacío o un árbol binario con las siguientes propiedades: (
1) si su subárbol izquierdo no está vacío, todos los nodos del subárbol izquierdo Es menor que el valor del nodo raíz;
⑵ si su subárbol derecho no está vacío, entonces los valores de todos los nodos en el subárbol derecho son mayores que el valor del nodo raíz;
⑶ sus subárboles izquierdo y derecho también están ordenados binariamente Arbol
Un recorrido de orden medio de un árbol de clasificación binario puede dar como resultado una secuencia ordenada por clave.

#include <iostream> 
using namespace std; 
template<class DataType>  
struct BiNode{    
	DataType data;     
	BiNode *lchild, *rchild;  
};
class BiSortTree { 
public:     
	BiSortTree(int a[ ], int n);      
	~ BiSortTree( ){Release(root);}  
	void InOrder( ){InOrder(root);}
	BiNode *InsertBST(int x) {return InsertBST(root, x);}
	BiNode *SearchBST(int k) {return SearchBST(root, k);}
	void DeleteBST(BiNode *p, BiNode *f );
private:
	void Release(BiNode *bt);    
	BiNode *InsertBST(BiNode *bt , int x);      
	BiNode *SearchBST(BiNode *bt, int k);     
	void InOrder(BiNode *bt);
	BiNode *root;
};

Inserción del árbol de clasificación binaria
void InsertBST (BiNode * & root, BiNode * s);
Análisis: si el árbol de clasificación binaria es un árbol vacío, el nodo recién insertado es el nuevo nodo raíz; de lo contrario, el nodo recién insertado Debe ser un nuevo nodo hoja cuya posición de inserción se obtiene mediante el proceso de búsqueda.
Algoritmo de inserción del árbol de clasificación binaria : si el árbol de clasificación binaria es un árbol vacío, el nodo recién insertado es el nuevo nodo raíz; de lo contrario, si el valor insertado es mayor que el valor del nodo raíz, inserte en el subárbol derecho ; De lo contrario, inserte en el subárbol izquierdo. Recursivamente.

BiNode *BiSortTree::InsertBST(BiNode *bt, int x) 
{  
	if (bt == NULL){
		BiNode *s = new BiNode;    
		s->data = x;   
		s->lchild = NULL;   
		s->rchild = NULL;   
		bt = s;   
		return bt;  
	}
	else if (bt->data > x)    
		bt->lchild = InsertBST(bt->lchild, x);  
	else   
		bt->rchild = InsertBST(bt->rchild, x); 
}

Construcción
de un árbol de ordenamiento binario A partir de un árbol de ordenamiento binario vacío, uno por uno se inserta en secuencia.

BiSortTree::BiSortTree(int a[ ], int n) 
{  
	root = NULL;  
	for (int i = 0; i < n; i++)   
		root = InsertBST(root, a[i]); 
}

Eliminación
del árbol de clasificación binaria Después de eliminar un nodo en el árbol de clasificación binaria, las características del árbol de clasificación binaria se mantienen.
Discuta en tres situaciones:
1. El nodo eliminado es una hoja;
2. El nodo eliminado solo tiene un subárbol izquierdo o solo un subárbol derecho;
3. El nodo eliminado tiene un subárbol izquierdo y un subárbol derecho .

Caso 1: el nodo eliminado es un nodo hoja.
Operación: cambie el valor del campo de puntero correspondiente en el nodo primario a nulo.
Caso 2: el nodo eliminado solo tiene el subárbol izquierdo o solo el subárbol derecho
Operación: Apunte el valor del campo de puntero correspondiente del nodo primario al subárbol izquierdo (o subárbol derecho) del nodo eliminado.
Caso 3: el nodo eliminado tiene un subárbol izquierdo y un subárbol derecho
Operación: Reemplácelo con su predecesor (el valor más grande en el subárbol izquierdo) y luego elimine el nodo predecesor.
Acción: reemplácelo con su sucesor (el valor más pequeño en el subárbol derecho) y luego elimine el nodo precursor.
Eliminar el algoritmo del árbol de ordenamiento binario —— Pseudocódigo
1. Si el nodo p es una hoja, elimine el nodo p directamente;
2. Si el nodo p solo tiene el subárbol izquierdo, solo necesita volver a conectar el subárbol izquierdo de p; si Si el nodo p solo tiene el subárbol derecho, solo necesita volver a conectar el subárbol derecho de p;
3. Si los subárboles izquierdo y derecho del nodo p no están vacíos, entonces
3.1 encuentre el nodo inferior más a la izquierda en el subárbol derecho del nodo p Y el nodo padre s par;
3.2 Reemplace el campo de datos del nodo s al campo de datos del nodo eliminado p;
3.3 Si el hijo derecho del nodo p no tiene un subárbol izquierdo, conecte el subárbol derecho de s a la derecha del par En el subárbol; de lo contrario, conecte el subárbol derecho de s al subárbol izquierdo del nodo par;
3.4 Elimine el nodo s;

void BiSortTree::DeleteBST(BiNode<int> *p, BiNode<int> *f ) 
{   
	if (!p->lchild && !p->rchild)  
	{                  
		if(f->child==p)        
			f->lchild= NULL;                 
		else  
			f->lchild= NULL;                
		delete p;    
	}
	else if (!p->rchild) 
	{
		if(f->child==p)   
			f->lchild=p->lchild;              
		else 
			f->rchild=p->lchild;                 
		delete p;   
	}
	else if (!p->lchild) 
	{
		if(f->child==p)  
			f->lchild=p->rchild;    
		else 
			f->rchild=p->rchild;             
		delete p;          
	}
	else 
	{
		par=p;  
		s=p->rchild;                
		while (s->lchild!=NULL)       
		{                
			par=s;                
			s=s->lchild;              
		}
		p->data=s->data;              
		if (par==p) 
			p->rchild=s->rchild;              
		else 
			par->lchild=s->rchild;          
		delete s;            
	}
}         

Búsqueda
de un árbol de clasificación binaria El proceso de búsqueda de un valor dado k en un árbol de clasificación binaria es: (
1) Si la raíz es un árbol vacío, la búsqueda falla; (
2) Si k = raíz-> datos, la búsqueda es exitosa; de lo contrario
(3) Si k < raíz-> datos, busque en el subárbol izquierdo de la raíz; de lo contrario
busque en el subárbol derecho de la raíz.
El proceso anterior continúa hasta que se encuentra k o el subárbol a buscar está vacío. Si el subárbol a buscar está vacío, la búsqueda falla.
La eficiencia de búsqueda del árbol de clasificación binaria es que solo se necesita buscar uno de los dos subárboles.

BiNode *BiSortTree::SearchBST(BiNode<int> *root, int k) 
{     
	if (root==NULL)     
		return NULLelse if (root->data==k)                
		return root;
	else if (k<root->data)                
		return SearchBST(root->lchild, k);     
	else            
		return SearchBST(root->rchild, k); 
}

Análisis de rendimiento de búsqueda del
árbol de clasificación binaria El rendimiento de búsqueda del árbol de clasificación binaria depende de la forma del árbol de clasificación binaria, que se encuentra entre O (log2n) y O (n) .

48 artículos originales publicados · Me gusta 25 · Visita 2453

Supongo que te gusta

Origin blog.csdn.net/qq_43628959/article/details/103359099
Recomendado
Clasificación