Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct nodo{
- int valor;
- struct nodo* ptrHI;
- struct nodo* ptrHD;
- } TNodo;
- typedef struct nodo6{
- int valor;
- struct nodo6* sig;
- }TLista;
- typedef struct nodo2{
- TNodo* valor;
- struct nodo2* sig;
- }TCola;
- void crear_arbol(TNodo ** ptrRaiz);
- void inserta_nodo(TNodo **ptrRaiz, int valor);
- void inserta_final(TLista **, int);
- void ladoIzquierda(TNodo *, TLista**);
- void Perimetro(TNodo*);
- void crear_arbol(TNodo ** ptrRaiz){
- *ptrRaiz = NULL;
- }
- void inserta_nodo(TNodo **ptrRaiz, int valor){
- TNodo *ptrHoja, *ptrRecorrido, *ptrPadre;
- ptrHoja = (TNodo*)malloc(sizeof(TNodo));
- ptrHoja->valor = valor;
- ptrHoja->ptrHI=ptrHoja->ptrHD=NULL;
- if(*ptrRaiz){
- ptrRecorrido = *ptrRaiz;
- ptrPadre = NULL;
- while (ptrRecorrido){
- ptrPadre = ptrRecorrido;
- if (ptrRecorrido->valor > valor)
- ptrRecorrido = ptrRecorrido->ptrHI;
- else
- ptrRecorrido = ptrRecorrido->ptrHD;
- }
- if (ptrPadre->valor > valor)
- ptrPadre->ptrHI = ptrHoja;
- else
- ptrPadre->ptrHD = ptrHoja;
- }
- else{
- *ptrRaiz = ptrHoja;
- }
- }
- void inserta_final(TLista **ptrListaSE, int valor){
- TLista *ptrNuevo, *ptrUltimo, *ptrRecorrido;
- ptrNuevo = (TLista*)malloc(sizeof(TLista));
- ptrNuevo->valor = valor;
- ptrNuevo->sig = NULL;
- ptrRecorrido = *ptrListaSE;
- ptrUltimo = NULL;
- while (ptrRecorrido){
- ptrUltimo = ptrRecorrido;
- ptrRecorrido = ptrRecorrido->sig;
- }
- if (ptrUltimo)
- ptrUltimo->sig = ptrNuevo;
- else
- (*ptrListaSE) = ptrNuevo;
- }
- void ponerEnCola(TNodo*nodo, TCola**Cola){ //lo pone al ultimo, no pone nulos
- if(nodo){
- TCola*nuevo=(TCola*)malloc(sizeof(TCola));
- nuevo->valor=nodo;
- nuevo->sig=NULL;
- TCola*recor=*Cola;
- TCola*ant=NULL;
- while(recor){
- ant=recor;
- recor=recor->sig;
- }
- if(ant==NULL){
- *Cola=nuevo;
- }else{
- ant->sig=nuevo;
- }
- }
- }
- TNodo* sacarDeCola(TCola**Cola){ //saca el del primero
- if(*Cola){
- TNodo*nuevo;
- TCola*sacar=*Cola;
- nuevo=sacar->valor;
- *Cola=(*Cola)->sig;
- free(sacar);
- return nuevo;
- }
- }
- /*procedimiento para recorrer todo los hijos izquierdos del arbol y insertarlos
- al final de la lista*/
- void ladoIzquierdo(TNodo*arbol2,TLista **lista){
- if(arbol2){
- if(arbol2->ptrHI){
- TNodo*padre=arbol2;
- TNodo* recor=arbol2->ptrHI;
- while(recor){
- inserta_final(&(*lista),padre->valor);
- padre=recor;
- recor=recor->ptrHI;
- if (recor == NULL)
- recor=padre->ptrHD;
- }
- }
- }
- }
- void ladoDerecho(TNodo*arbol2,TLista **lista){
- if(arbol2){
- if(arbol2->ptrHD && arbol2->ptrHD->ptrHD){
- TNodo*padre=arbol2->ptrHD;
- TNodo* recor=arbol2->ptrHD->ptrHD;
- while(recor){
- inserta_final(&(*lista),padre->valor);
- padre=recor;
- recor=recor->ptrHD;
- if (recor == NULL)
- recor=padre->ptrHI;
- }
- }
- }
- }
- void HijosArbol(TNodo*arbol2,TLista **lista){ //las hojas del arbol
- if (arbol2){
- TCola*cola=NULL;
- ponerEnCola(arbol2,&cola);
- while(cola){
- TNodo*nodo=sacarDeCola(&cola);
- if(nodo->ptrHD==NULL && nodo->ptrHI==NULL)
- inserta_final(&(*lista),nodo->valor);
- ponerEnCola(nodo->ptrHI,&cola);
- ponerEnCola(nodo->ptrHD,&cola);
- }
- }
- }
- void perimetro(TNodo*arbol2){
- TLista *lista=NULL;
- ladoIzquierdo(arbol2,&lista); //aca pondra en la lista el lado izquierdo del arbol, incluido la raiz, pero sin que sea hoja
- HijosArbol(arbol2,&lista);// //aca pondra todas las Hojas del arbol
- ladoDerecho(arbol2,&lista); //aca pondra en la lista el lado derecho del arbol, pero sin la raiz, pero sin que sea hoja
- /*Procedemos a imprimir el perimetro*/
- TLista *recor=lista;
- while(recor){
- printf("%d-",recor->valor);
- recor=recor->sig;
- }
- }
- int main(int argc, char** argv) {
- TNodo *ptrRaiz;
- crear_arbol(&ptrRaiz);
- inserta_nodo(&ptrRaiz, 4);
- inserta_nodo(&ptrRaiz, 2);
- inserta_nodo(&ptrRaiz, 1);
- inserta_nodo(&ptrRaiz, 6);
- inserta_nodo(&ptrRaiz, 5);
- inserta_nodo(&ptrRaiz, 7);
- perimetro(ptrRaiz);
- return (EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement