This repository has been archived by the owner on Oct 17, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
EjerciciosArboles.h
404 lines (341 loc) · 9.12 KB
/
EjerciciosArboles.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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
#pragma once
#include <iostream>
using namespace std;
#include "Definiciones.h"
/*
* EJERCICIO OPCIONAL
PRE: recibe un arbol binario
POS: devuelve la altura del arbol recibido.
Se define altura de un árbol binario como la cantidad de nodos del camino más largo que va desde la raíz hasta una hoja.
Ejemplo
Entrada: {1,2,3,#,#,4,#,#,5}
1
/ \
2 3
/
4
\
5
Retorno: 4
*/
int altura(NodoAB* raiz);
/*
* EJERCICIO OPCIONAL
PRE: Recibe dos arboles binarios.
POS: Retorna true si y solo si los dos arboles son iguales.
(Dos arboles binarios son iguales si tienen los mismos elementos en las mismas posiciones).
Ejemplo
Entrada: {1,2,3}, {1,2,3}
1 1
/ \ / \
2 3 2 3
Salida: true
Entrada: {1,3,2}, {1,2,3}
1 1
/ \ / \
3 2 2 3
Salida: false
*/
bool sonIguales(NodoAB* p, NodoAB* q);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un árbol binario (raiz) y un entero (n)
POS: Retorna true si y solo si existe un camino desde la raíz hasta una hoja que sume sum.
El árbol vacío suma 0.
Ejemplo
Entrada: {1,2,3}, 4
1
/ \
2 3
Salida: true
*/
bool existeCaminoConSuma(NodoAB* raiz, int sum);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un árbol binario
POS: Retorna true si y solo si el arbol está balanceado.
Un arbol está balanceado, si y solo si, para cualquier nodo, la diferencia de altura entre la rama
izquierda y la derecha es a lo sumo 1.
Notar que si el árbol es vacío entonces está balanceado.
Ejemplo
Entrada: {1,#,2,#,3}
1
\
2
\
3
Salida: false
*/
bool esArbolBalanceado(NodoAB* raiz);
/*
* EJERCICIO OPCIONAL
PRE: Recibe un árbol binario (a) y un entero (k) mayor a 0.
POS: Retorna una lista con todos los elementos presentes en el nivel k del arbol a ordenados de izquierda
a derecha. En caso de no existir el nivel retornar NULL.
El árbol no debe ser modificado en la función.
Ejemplo
Entrada: {1,2,3,4,5}, 2
1
/ \
2 3
/ \
4 5
Salida: (2,3)
*/
NodoLista* enNivel(NodoAB* a, int k);
/*
* EJERCICIO OPCIONAL
PRE: Recibe un árbol (a) y dos enteros (desde y hasta) mayores a 0.
POS: Retorna la cantidad de nodos ubicados entre los niveles desde y hasta del árbol a.
En caso de no haber ningún nodo entre los niveles dados o que éstos no sean válidos (desde>hasta), se deberá
retornar 0. Recordar que (en caso de existir) la raíz de un árbol ocupa el nivel 1.
Ejemplo
Entrada: {1,2,3,4,5,6,#}, desde=2, hasta=4
1
/ \
2 3
/ \ /
4 5 6
Salida: 5
*/
int cantNodosEntreNiveles(NodoAB* a, int desde, int hasta);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un árbol binario de busqueda de enteros y un entero (x).
x pertenece al árbol.
POS: Retorna la lista con camino de la raíz hasta donde se encuentra el elemento x en el árbol.
Ejemplo
Entrada: {8,3,10,1,5,9,13}, 9
8
/ \
3 10
/ \ / \
1 5 9 13
Salida: (8,10,9)
*/
NodoLista* camino(NodoAB* arbol, int x);
/*
* EJERCICIO OPCIONAL
PRE: recibe un arbol binario, y un entero k mayor o igual a 0
POS: retorna un nuevo árbol en el cual cada nodo Invertirá sus punteros de izquierda y derecha, "espejando" el árbol
solo se consideraran los elementos en niveles menores o iguales a k
si k es mayor o igual a la altura del árbol, se deberá retornar una copia completa Invertida.
si k=0, retornará NULL
el arbol recibido por parametro no debe ser modificado
Ejemplo:
Entrada: {1,2,3,4,5,6,7,8,9}, 3
1
/ \
2 3
/ \ / \
4 5 6 7
/ \
8 9
Retorno:
1
/ \
3 2
/ \ / \
7 6 5 4
*/
NodoAB* invertirHastak(NodoAB* a, int k);
/*
* EJERCICIO OBLIGATORIO
PRE: recibe un arbol binario de búsqueda a, no vacío
POS: elimina el dato que se encuentra en la raíz de a.
Luego de la función el arbol debe seguir siendo una arbol binario de busqueda
la forma del arbol resultante no es importante (siempre que sea un ABB)
Ejemplo: {3,2,6}
3
/ \
2 6
Resultado: {2,#,6}
*/
void borrarNodoRaiz(NodoAB * & A);
/*
* EJERCICIO OPCIONAL
PRE: Recibe un árbol binario de búsqueda (ABB).
POS: Devuelve true si existen dos naturales en el ABB tales que sumados son equivalentes a n.
Ejemplo
Entrada: {5,3,7,1,4,6,#}, 8
5
/ \
3 7
/\ /
1 4 6
Salida: true
*/
bool sumaABB(NodoAB* a, int n);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un árbol binario de búsqueda (ABB) y n natural perteneciente o no al ABB.
POS: Dado un número n, computa su sucesor tal que sea perteneciente al ABB.
Es decir el menor número tal que es mayor que n y pertenece al árbol.
Si no se encuentra el sucesor devuelve -1.
No se pueden usar estructuras auxiliares (vector, lista, otro arbol, etc).
Ejemplo 1
Entrada: {5,3,7,1,4,6,#}, 3
5
/ \
3 7
/\ /
1 4 6
Salida: 4
----------
Ejemplo 2
Entrada: {5,3,7,1,4,6,#}, 2
5
/ \
3 7
/\ /
1 4 6
Salida: 3
----------
Ejemplo 2
Entrada: {5,3,7,1,4,6,#}, 7
5
/ \
3 7
/\ /
1 4 6
Salida: -1
*/
int sucesor(NodoAB* a, int n);
/*
* EJERCICIO OBLIGATORIO
PRE: recibe un arbol binario
POS: Retorna el nivel con mas nodos, desde el nivel 1 hasta nivelHasta.
En caso de que el árbol sea vacio se debera retornar cero.
Ante un empate debera retornar el número de nivel mas pequeño.
NOTA: Esta operación se puede realizar en O(n).
Ejemplo
Entrada: {1,2,3,#,#,4,#,#,5}
1
/ \
2 3
/
4
\
5
Retorno: 2
*/
int nivelMasNodos(NodoAB* raiz, int nivelHasta);
/*
* EJERCICIO OPCIONAL
PRE:
POS: Implemente un procedimiento void borraPares(NodoAB *&arbol); que dado un árbol binario de busqueda
a elimine todos los elementos pares del mismo, modificando al árbol pasado por parámetro.
Ejemplos:
borrarPares({4,2,6,1,3,5,7}) = {5,3,7,1}
*/
void borrarPares(NodoAB* & a);
/*
* EJERCICIO OPCIONAL
PRE: Recibe un árbol general implementado como un arbol binario (primer hijo – siguiente hermano),
POS: Retorna la altura del arbol recibido.
Se define altura de un árbol general como la cantidad de nodos del camino más largo que va desde la raíz hasta una hoja.
Ejemplo
Entrada: {{1,2,5,#,#,3,#,4,#,#}}
1
/
2 - 3 - 4
/
5
Retorno: 3
*/
int alturaAG(NodoAG* raiz);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un arbol general implementado como un arbol binario (primer hijo – siguiente hermano)
POS: Retorna la suma los valores de los niveles pares y resta los valores de los impares.
La raíz se encuentra en el nivel 1.
Ejemplo
Entrada: {{1,2,5,#,#,3,#,4,#,#}}
1
/
2 - 3 - 4
/
5
Retorno: 3
*/
int sumaPorNiveles(NodoAG* raiz);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un arbol general sin repetidos implementado como un arbol binario (primer hijo – siguiente hermano)
y una lista de enteros
POS: Retorna true si y sólo si la lista es un prefijo de algún camino del árbol general, comenzando desde la raíz.
La lista vacía es prefijo de cualquier camino (incluso del camino vacío, si el árbol es vacío).
No se permite usar funciones o procedimientos auxiliares en este ejercicio.
NOTA: Esta operación se puede realizar en O(n).
Ejemplo 1
Entrada: {{1,2,5,#,#,3,7,4,#,#}},{1,2,5}
1
/
2 - 3 - 4
/ |
5 7
Retorno: true
------------------------
Ejemplo 2
Entrada: {{1,2,5,#,#,3,#,4,#,#}},{1,2,3,4}
1
/
2 - 3 - 4
/
5
Retorno: false
------------------------
Ejemplo 3
Entrada: {{1,2,5,#,#,3,#,4}},{1,4}
1
/
2 - 3 - 4
/
5
Retorno: true
------------------------
Ejemplo 4
Entrada: {{1,2,5,#,#,3,#,#,6,7,#,8}},{6,8}
1 - 6
/ /
2 - 3 7 - 8
/
5
Retorno: true
*/
bool esPrefijo(NodoAG *a, NodoLista *l);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un arbol general implementado como un arbol binario (primer hijo – siguiente hermano)
y un número.
POS: Retorna una lista con los datos en el camino de la raiz al número dado.
Si el número está repetido retorna el camino que incluya a los primeros hermanos.
Si el número no se encuentra en el árbol retorna NULL.
No se permite usar funciones o procedimientos auxiliares en este ejercicio.
Resolver en O(n).
Ejemplo: ENTRADA
ARBOL DATO 5;
1
|
2 -> 3
| |
4 5
SALIDA 1->3->5;
*/
NodoLista* caminoAG(NodoAG *a, int dato);
/*
* EJERCICIO OBLIGATORIO
PRE: Recibe un arbol general implementado como un arbol binario (primer hijo – siguiente hermano).
POS: Retorna el nivel con mas nodos del AG. En caso de haber mas de un nivel con la misma cantidad
de nodos retorna el menor. La raíz se encuentra en el nivel 1.
NOTA: Esta operación se puede realizar en O(n).
Ejemplo: ENTRADA
ARBOL
1 Nivel 1
|
2 -> 3 Nivel 2
| |
4 5 Nivel 3
SALIDA Nivel 2;
*/
int nivelConMasNodosAG(NodoAG * arbolGeneral);