Dudas generales

Dudas generales

de Pablo Palou Singlet -
Número de respuestas: 4
Hola. Me quedaron varias dudas al intentar hacer los ejercicios del practico.

1. Cuando yo inserto un elemento con un procedimiento insertar(uint x, ABB &a), es importante hacia donde queda apuntando el árbol a ? A dónde se supone que queda apuntando? Si yo uso luego el árbol fuera del procedimiento, el árbol a sigue apuntando a la raíz?

2. Cuando tengo que liberar un árbol, hay que liberar el elemento antes de hacer delete borrar? (siendo borrar un puntero a un árbol). En caso de que haya que liberar el elemento previamente, se puede hacer delete borrar->elem?

3. En la función borrar del ejercicio 5. Yo lo que hago es buscar el elemento, y luego verificar todas las condiciones necesarias y ahi eliminar el nodoAG. Pero; cómo hago para que el padre del que yo borré apunte a NULL? Porque si bien estoy borrando un nodo, no estoy dejando bien al árbol.

Desde ya, muchas gracias.

En respuesta a Pablo Palou Singlet

Re: Dudas generales

de Matias Richart -

Hola Pablo. Respondo a tus preguntas en negrita.


1. Cuando yo inserto un elemento con un procedimiento insertar(uint x, ABB &a), es importante hacia donde queda apuntando el árbol a ?

Si es importante.

A dónde se supone que queda apuntando?

Depende de lo que hayas hecho, no entiendo mucho la duda.

Si yo uso luego el árbol fuera del procedimiento, el árbol a sigue apuntando a la raíz?

El insertar debería devolver un árbol con el elemento insertado. Es decir, un puntero que apunte a la raíz del árbol que se desea devolver.

Con respecto a todo esto, te recomiendo la explicación de insertar que está en este video de teórico https://www.youtube.com/embed/HP1AFJl0j3s?start=620&end=2585&version=3

Verás que se propone una solución recursiva que modifica (cuando es necesario) el puntero a la raíz.

2. Cuando tengo que liberar un árbol, hay que liberar el elemento antes de hacer delete borrar? (siendo borrar un puntero a un árbol).

Depende como está definida la estructura del nodo y el elemento.

Por ejemplo, en las definiciones de las figuras 1 y 2 del práctico 4, eso no es necesario porque el elemento es un natural definido dentro del nodo.

En el árbol del ej. 4, tampoco es necesario porque el elemento es un struct dentro del nodo.

Sin embargo, si tuviéramos una estructura como la que pongo acá abajo si sería necesario. Si ves, en este caso el elemento es un puntero a otro lugar de memoria que cuando se creó el nodo se debió reservar.

struct EstInfo {

  uint nota;

  int ci;

};

struct nodoABB {

  EstInfo *info;

  nodoABB * izq , * der ;

};

En caso de que haya que liberar el elemento previamente, se puede hacer delete borrar->elem?

Exacto. en el ejemplo anterior sería delete borrar->info;

3. En la función borrar del ejercicio 5. Yo lo que hago es buscar el elemento, y luego verificar todas las condiciones necesarias y ahi eliminar el nodoAG. Pero; cómo hago para que el padre del que yo borré apunte a NULL? Porque si bien estoy borrando un nodo, no estoy dejando bien al árbol.

El padre del nodo que borraste no debería apuntar a null, sino al siguiente hermano.

Cuando planteas una solución recursiva, tené en cuenta que el puntero en el que estas parado es el puntero del padre que apunta al hijo. Es decir, si tu puntero es a, podes hacer aux = a; a = a->sH; delete aux;

Desde ya, muchas gracias.

Espero se entienda. Cualquier cosa preguntá nuevamente.


En respuesta a Matias Richart

Re: Dudas generales

de Pablo Palou Singlet -

Perfecto, muchas gracias. Me sigue quedando una pequeña duda con el ejercicio de Insertar de openfing que me señalaste. En ese ejercicio, una vez que el procedimiento termina, a donde queda apuntando el árbol? Según entendí debiera quedar apuntando a la raíz del nuevo árbol, con el elemento insertado, pero en el ejercicio me parece como que queda apuntando al elemento insertado y no a la raíz. Capaz tengo errores en algunos conceptos.

En respuesta a Pablo Palou Singlet

Re: Dudas generales

de Matias Richart -

El árbol original t con el que fue llamada la función queda apuntando a la raíz.

Fijate que ese primer puntero solo se modificará si el árbol original es vació, en cualquier otro caso, se llama recursivamente con los punteros al izquierdo o derecho y en esos casos t ya no se modifica.

En las nuevas llamadas, t será oto puntero, el del subárbol izquierdo o derecho.

Es un poco difícil explicar mejor por este medio. Te recomiendo la explicación que hace Carlos a partir del minuto 28:35 en el video. El concepto de ir "montado" sobre el árbol es importante para tu duda me parece.

Saludos