Solucion
(a) Construccion del BST
Insertamos [45,25,65,15,35,55,75,10,20,30] en un BST vacio. La regla de insercion: desde la raiz, si el valor es menor se baja a la izquierda, si es mayor a la derecha, hasta encontrar un hueco.
Nodo* insertar(Nodo* raiz, int x) {
if (raiz == nullptr) return new Nodo{x, nullptr, nullptr};
if (x < raiz->dato) raiz->izq = insertar(raiz->izq, x);
else raiz->der = insertar(raiz->der, x);
return raiz;
}
Traza de las inserciones que definen la forma:
45 es la raiz.
25 < 45 -> izquierda de 45. 65 > 45 -> derecha de 45.
15 < 45 < 25 -> izquierda de 25. 35: 35 < 45, 35 > 25 -> derecha de 25.
55: >45, <65 -> izquierda de 65. 75: >45, >65 -> derecha de 65.
10: <45,<25,<15 -> izquierda de 15. 20: <45,<25,>15 -> derecha de 15.
30: <45,>25,<35 -> izquierda de 35.
Arbol resultante:
45
/ \
25 65
/ \ / \
15 35 55 75
/ \ /
10 20 30
(b) Recorridos
void preorden(Nodo* n) { if(!n) return; visitar(n); preorden(n->izq); preorden(n->der); }
void inorden(Nodo* n) { if(!n) return; inorden(n->izq); visitar(n); inorden(n->der); }
void postorden(Nodo* n) { if(!n) return; postorden(n->izq); postorden(n->der); visitar(n); }
- Preorden (raiz, izq, der): 45, 25, 15, 10, 20, 35, 30, 65, 55, 75
- Inorden (izq, raiz, der): 10, 15, 20, 25, 30, 35, 45, 55, 65, 75
- Postorden (izq, der, raiz): 10, 20, 15, 30, 35, 25, 55, 75, 65, 45
(c) Por que el inorden sale ordenado
La propiedad de BST dice que, para todo nodo x, todas las claves del subarbol izquierdo son <x y todas las del subarbol derecho son >x. El recorrido inorden visita, en este orden exacto: (todo el subarbol izquierdo) → (el nodo) → (todo el subarbol derecho).
Por induccion sobre la altura: si inorden ordena correctamente cada subarbol (hipotesis), entonces produce primero todas las claves menores que x en orden, luego x, y luego todas las mayores que x en orden. El resultado global queda ordenado ascendentemente. Por eso el inorden de un BST siempre entrega los elementos de menor a mayor.
(d) Altura del arbol
Usando la convencion de altura en aristas (un nodo solo tiene altura 0), el camino mas largo es 45→25→15→10 (o →25→35→30): altura =3 (equivalente a 4 niveles).
La altura minima para n=10 nodos es
hmin=⌊log2n⌋=⌊log210⌋=⌊3.32⌋=3.
El arbol obtenido ya alcanza la altura minima (3=hmin): esta bien balanceado gracias al orden afortunado de las inserciones.
(e) Insercion en orden ascendente
Si se insertan [10,15,20,25,30,35,45,55,65,75], cada valor nuevo es mayor que todos los anteriores, asi que siempre baja a la derecha. El arbol degenera en una cadena inclinada a la derecha (una lista enlazada disfrazada):
10
\
15
\
20
\
25
\
... -> 75
Su altura es n−1=9. Esto es problematico: la busqueda, la insercion y la eliminacion pasan de O(logn) (arbol balanceado) a O(n) (recorrido lineal). Se pierde por completo la ventaja del BST. Este es justamente el motivo por el que existen los arboles auto-balanceados (AVL, rojo-negro), que garantizan altura O(logn) sin importar el orden de insercion.
(f) Eliminar el nodo 25 (dos hijos)
El nodo 25 tiene dos hijos (subarbol izquierdo con raiz 15 y derecho con raiz 35). No se puede simplemente quitar. El procedimiento estandar:
- Buscar el sucesor inorden de 25: el minimo del subarbol derecho. El subarbol derecho tiene raiz 35 y su hijo izquierdo es 30; el minimo (mas a la izquierda) es 30.
- Copiar el valor del sucesor (30) en el nodo a eliminar (reemplaza al 25).
- Eliminar el nodo original 30, que ahora es una hoja (o tiene a lo sumo un hijo derecho), caso facil.
El sucesor inorden siempre tiene a lo sumo un hijo, por eso este truco convierte el caso dificil (dos hijos) en uno sencillo. Arbol resultante:
45
/ \
30 65
/ \ / \
15 35 55 75
/ \
10 20
Se conserva la propiedad de BST: bajo el 30, el subarbol izquierdo {10,15,20} es menor que 30 y el derecho {35} es mayor. (Alternativamente se pudo usar el predecesor inorden — el maximo del subarbol izquierdo, que es 20 — con un resultado igualmente valido.)