-
Notifications
You must be signed in to change notification settings - Fork 0
/
abb.h
133 lines (114 loc) · 4.3 KB
/
abb.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef __ARBOL_BINARIO_DE_BUSQUEDA_H__
#define __ARBOL_BINARIO_DE_BUSQUEDA_H__
#define ABB_RECORRER_INORDEN 0
#define ABB_RECORRER_PREORDEN 1
#define ABB_RECORRER_POSTORDEN 2
#include <stdbool.h>
#include <stdlib.h>
/*
* Comparador de elementos. Recibe dos elementos del arbol y devuelve
* 0 en caso de ser iguales, 1 si el primer elemento es mayor al
* segundo o -1 si el primer elemento es menor al segundo.
*/
typedef int (*abb_comparador)(void*, void*);
/*
* Destructor de elementos. Cada vez que un elemento deja el arbol
* (arbol_borrar o arbol_destruir) se invoca al destructor pasandole
* el elemento.
*/
typedef void (*abb_liberar_elemento)(void*);
typedef struct nodo_abb {
void* elemento;
struct nodo_abb* izquierda;
struct nodo_abb* derecha;
} nodo_abb_t;
typedef struct abb{
nodo_abb_t* nodo_raiz;
abb_comparador comparador;
abb_liberar_elemento destructor;
} abb_t;
/*
* Crea el arbol y reserva la memoria necesaria de la estructura.
* Comparador se utiliza para comparar dos elementos.
* Destructor es invocado sobre cada elemento que sale del arbol,
* puede ser NULL indicando que no se debe utilizar un destructor.
*
* Devuelve un puntero al arbol creado o NULL en caso de error.
*/
abb_t* arbol_crear(abb_comparador comparador, abb_liberar_elemento destructor);
/*
* Inserta un elemento en el arbol.
* Devuelve 0 si pudo insertar o -1 si no pudo.
* El arbol admite elementos con valores repetidos.
*/
int arbol_insertar(abb_t* arbol, void* elemento);
/*
* Busca en el arbol un elemento igual al provisto (utilizando la
* funcion de comparación) y si lo encuentra lo quita del arbol.
* Adicionalmente, si encuentra el elemento, invoca el destructor con
* dicho elemento.
* Devuelve 0 si pudo eliminar el elemento o -1 en caso contrario.
*/
int arbol_borrar(abb_t* arbol, void* elemento);
/*
* Busca en el arbol un elemento igual al provisto (utilizando la
* funcion de comparación).
*
* Devuelve el elemento encontrado o NULL si no lo encuentra.
*/
void* arbol_buscar(abb_t* arbol, void* elemento);
/*
* Devuelve el elemento almacenado como raiz o NULL si el árbol está
* vacío o no existe.
*/
void* arbol_raiz(abb_t* arbol);
/*
* Determina si el árbol está vacío.
* Devuelve true si está vacío o el arbol es NULL, false si el árbol tiene elementos.
*/
bool arbol_vacio(abb_t* arbol);
/*
* Llena el array del tamaño dado con los elementos de arbol
* en secuencia inorden.
* Devuelve la cantidad de elementos del array que pudo llenar (si el
* espacio en el array no alcanza para almacenar todos los elementos,
* llena hasta donde puede y devuelve la cantidad de elementos que
* pudo poner).
*/
int arbol_recorrido_inorden(abb_t* arbol, void** array, int tamanio_array);
/*
* Llena el array del tamaño dado con los elementos de arbol
* en secuencia preorden.
* Devuelve la cantidad de elementos del array que pudo llenar (si el
* espacio en el array no alcanza para almacenar todos los elementos,
* llena hasta donde puede y devuelve la cantidad de elementos que
* pudo poner).
*/
int arbol_recorrido_preorden(abb_t* arbol, void** array, int tamanio_array);
/*
* Llena el array del tamaño dado con los elementos de arbol
* en secuencia postorden.
* Devuelve la cantidad de elementos del array que pudo llenar (si el
* espacio en el array no alcanza para almacenar todos los elementos,
* llena hasta donde puede y devuelve la cantidad de elementos que
* pudo poner).
*/
int arbol_recorrido_postorden(abb_t* arbol, void** array, int tamanio_array);
/*
* Destruye el arbol liberando la memoria reservada por el mismo.
* Adicionalmente invoca el destructor con cada elemento presente en
* el arbol.
*/
void arbol_destruir(abb_t* arbol);
/*
* Iterador interno. Recorre el arbol e invoca la funcion con cada
* elemento del mismo. El puntero 'extra' se pasa como segundo
* parámetro a la función. Si la función devuelve true, se finaliza el
* recorrido aun si quedan elementos por recorrer. Si devuelve false
* se sigue recorriendo mientras queden elementos.
* El recorrido se realiza de acuerdo al recorrido solicitado. Los
* recorridos válidos son: ABB_RECORRER_INORDEN, ABB_RECORRER_PREORDEN
* y ABB_RECORRER_POSTORDEN.
*/
void abb_con_cada_elemento(abb_t* arbol, int recorrido, bool (*funcion)(void*, void*), void* extra);
#endif /* __ARBOL_BINARIO_DE_BUSQUEDA_H__ */