tutorial crear arboles en c++
DESCRIPTION
tutorial crear arboles en c++ en eclipseTRANSCRIPT
1
Tutorial crear arboles
Creamos una clase llamada nodo
2
Creamos un puntero al siguiente nodo que va a manejar la parte de los hijos de manera que se haga la implementación de lista
c
Colocamos un string que va a representar la descripción y la librería string
Como string esta en eel name space lo vamos a utilizar
Utilizamos un método agregar hijo este método es void no retorna nada y recibe como y recibe como parámetro un puntero al nodo que se quiere
agregar como hijo
3
Otro método que vamos a usar es el método que retorna el listado de hijosget hijos retornna al 1°nodo de la lista de hijos que tenga en
particular
agregamos un atributo entero el cual contendrá la cantidad de hijos que tenga en particular
Procedamos a aregar los getters y setters
4
Hacemos clic derecho vamos a source
Ok
Procedemos a implementar en el archivo de implementación los métodos que hemos definido aquí como por ejemplo agregar hijos y get hijos de igual suerte podemos colocar que el constructor de la clase nodo reciba como parámetro un string con el nombre de modo que al instanciar lo pasemos por parámetro al constructor el nombre que tendrá ese nodo y asi nos ahorrramos un paso de manera contraria tocaria instanciar la clase nodo y posteriormente mediante el método set nombre asignaaar un nombre a este nodo, una ves hecho esto podemos implementar estos
5
métodos haciendo clic derecho clic en source implements method
Supongamos que queremos implementar estosd tres metodos
ok
Y aparecen agregsdos estos tres metodos
6
como el constructor que aparece en la parte superior no recibe parámetros
lo eliminamos
Entonces empezamos a implementarlo
Decimo que el atributo nombre es igual al parámetro nombre en el constructor vamos a aprovechar para inciaalizaar este atributo que se llama siguiente con el valor nulo para que no tome valores basura
7
En get hijos vamos a retornar el listado de hijos para esto vamos a agregar
En la cabecera un atributo de tipo puntero a nodo que va a apuntar hacia el primer hijo de este nodo digimos que era una lista de manera que a partir del primero podemos obtener los siguientes
este atributo que acabamos de crear pues evidentemente vamos a inicializarlo en null
8
primer hijo es igual a null para que se sepa que este nodo no tiene hijos
de modo que cuando llame al método get hijos vamos a retornar este primer hijo que pudiera ser nulo o no si retorna nulo este no tiene hijos
este es el método que me va agregar un hijo a mi nodo necesitamos otro puntero, ya tenemos el puntero del primer hijo que se necesita en el momento de recorrer la lista, pero es conveniente tener un puntero al ultimo hijo de modo que al agregar un hijo se agregue atrás o luego del ultimo hijo para esos fines hacemos otro atributo del tipo puntero a nodo
9
al cual llamaremos ultimo hijo
en el constructor diremos que este atributo que se llama ultimo hijo es nullo, antes de agregar un nodo debemos analizar si este no tiene hijos para yo saber si este nodo no tiene hijos para saber si este no tiene hijos es asi si este atributo es nulo pues ya sabemos que no tiene hijos entonces decimos que tanto el atributo primer hijo como el atributo ultimo hijo es igual a este nodo que me acaban de agregar de lo contrario si están agregando un nodo y ya ese nodo tiene hijos entonces a ese nodo que es el ultimo hijo lo vamos a poner como siguiente elemento(setsiguiente(nodo)) esto es una lista enlazada es un atributo privado lo puedo utilizar dentro de la misma claseluego le decimos que el ultimo hijo es ahora este nodo que acabamos de aagregar y hemos terminado con la clase nodo
10
ahora trabajemos con la clase arbolcon
el método recorrer con este podemos ver el contenido de todos los nodos del árbol orecorrer cada uno de ellos
pasamos a la clase árbol este tendrá un atributo del tipo privado y de tipo nodo como vamos a estar utiluizando la clase nodo vamos a incluir la librería de nodo le decimos que tiene un puntero de tipo nodo el cual será la raíz de ese árbol,
11
esta clase va tener un método void que va a ser recorrer el cual recibe como parámetro un puntero a nodo
ahora hacemos a este atributo raíz un getters de modo que las clases puedan accerder al atributo raíz y también podemos hacer un gett sett
12
Y luego colocamos al constructor del árbol podemos pasarlo un puntero a nodo podamos pasarle la raiz
Luego procedemos a implementar el código a estos metodos
13
Queremos recorrer el método recorrer como el constructor
Este constructor que no recibe parametros lo eliminamos
En el constructor de árbol vamos a decir que el atributo raíz es igual al parámetro raíz (this->raíz=raíz)
Antes de recorrer esos nodos vemos que al momento de agregar hijos nos falto incrementar la variable hijos que habíamos definido como un
14
atributo en la clase nodo
Le damos en el constructor de nodo un valor inicial, decir que hijos inicia en 0
El método recorrer lo primero que hace es imprimir utilizando el nombre de ese nodo y hace un salto de línea, luego de esto: si (if) ese nodo tiene hijos es decir si ese atributo es mayor que cero se hace lo siguiente: el primero de los hijos lo vamos a guardar en una variable de tipo que lo llamaremos I nos retorna el puntero al primer hijo (nodo* I=nodo->
15
gethijos();)
Ahora colocamos otro método accesor para acceder a ese atributo entero que me dice cuantos hijos tiene este listado este metodose va a llamar int getnumerohijo
Decimos que lo queremos implementar clic derecho-source-implement method
16
Al hacerlo vemos como se agrego getnumerohijos el cual vamos a decir el cual nos va a retornar el valor de atributo hijo (thispara aclarar que es un atributo)
Hacemos la siguiente modificación decimos que si el numero de es mayor que 0 entonces vamos a recorrer este listado de nodos recorrermos esto siempre y cuando(while)pase lo siguiente decíamos gethijos retorna solo un elemento el primero de la lista de hijos esto lo guardamos en la variable I que es un puntero a nodo y tendremos un ¡ que se va a repetir
17
siempre y cuando I sea diferente de null de modo que para cada uno de esos hijos vamos llamar recursivamente usando recursividad llamamos a recorrer y pasamos como parámetro a I y decimos que I => getSiguiente de modo que al final de cada vuelta I toma el valor del siguiente elemento de la lista hijos de ese nodo si getSiguiente retorna nulo no se repitara la próxima vuelta ahí terminamos este árbol sencillo utilizando listas enlazadas
Probamos vamos al archivo main
Creamos varios nodos tomamos el arbol siguiente
18
Al nodo A le agregamos los nodos hijos B,C,D
Vemos en la figura que B tiene como hijos E,F los cuales se crean de la misma maner que creamos los anteriores hijo pero esta vez son de B
Ahora creamos nuestro árbol llamamos árbol y al constructor le vamos a pasar como parámetro al nodo Aindicando que A es la raíz del árbol para recorrer este árbol decimos que árbol invocamos el método recorrer y le pasamos como parámetro la raíz de este árbol(getRaiz) como ya esta asignada es lo mismo que le pase a (a) como parametro
19
Incluimos a árbol.h para que el encuentre la clase árbol y a su vez árbol.h contiene a nodo.h
Al ejecutar este código vemos como hemos recorrido nuestro arbol
Los cuales imprimió los nodos con los hijos que le programamos si se quiere se sigue igual y se programa los otros
También se puede crear un árbol binario agregando a la clase árbol que ya creamos un atributo de tipo árbol que se haga referencia del árbol que queda a la derecha y otro atributo de tipo puntero a árbol que va hacer
20
referencia al sub árbol que queda a la izquierda