Está en la página 1de 6

Arboles

Programacin en C

RBOLES

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 1

Arboles

Programacin en C

Introduccin

Los rboles son tiles en


todos aquellos problemas
donde la informacin est
jerarquizada.
Elementos de un rbol

Nodo raiz

Nodo padre

Nodo:
Nodo padre:
Tiene nodos hijos.
Nodo hijo:
Tiene un nodo padre.
Nodo raiz o raiz del rbol:
No tiene nodo padre.
Nodo terminal u hoja:
No tiene nodos hijos

Nodo hijo

Altura o profundidad del rbol


Subrbol:

Nodo hoja

Subrbol

rbol que cuelga de un nodo.


Prof. Jos A. Rodrguez Mondjar
Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 2

Arboles

Programacin en C

Programacin en C

Estructuras recursivas
Funciones recursivas para
recorrer el rbol.

Informacin

typedef struct stNodoGen {


char sNom[20];
int nHijos;
struct stNodoGen *pHijos;
} TNodoGen;

Informacin

Informacin

nHijos= 1

nHijos= 2

pHijos

pHijos

nHijos= 2
pHijos

Informacin
nHijos= 0
pHijos

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

Pseudocdigo ArbolRecorrer
ArbolRecorrer(Nodo) {
Recursiva
Calculo(Nodo);
if (Hay hijos) {
Por cada hijo
ArbolRecorrer(Nodo hijo)
}
}
UPCO ICAI Departamento de Electrnica y Automtica 3

Arboles

Programacin en C

Ejemplo: rbol genealgico.


gen.txt
Pedro
2
Antonio
3
Carmen
0
Rafael
0
Gloria
0
Fernando
1
Juan
2
Maria
0
Juana
0

arbolgen.h
typedef struct stNodoGen {
char sNom[20];
int nHijos;
struct stNodoGen *pHijos;
} TNodoGen;
void
void
void
void

ArbolGenImp(FILE *pfic, TNodoGen *p);


ArbolGenLee(FILE *pfic, TNodoGen *p);
ArbolGenSalva(FILE *pfic, TNodoGen *p);
ArbolGenBorra(TNodoGen *p);
Pedro
Antonio

Carmen

Rafael

Fernando
Gloria

Juan
Mara

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

Juana

UPCO ICAI Departamento de Electrnica y Automtica 4

Arboles

Programacin en C

Leer el rbol genealgico


void ArbolGenLee(FILE *pfic, TNodoGen *p)
{
int i;
if (feof(pfic))
return;
fscanf(pfic,"%s",p->sNom);
fscanf(pfic,"%d",&(p->nHijos));
p->pHijos=NULL;
if (p->nHijos>0)
MemReserva(p->nHijos,sizeof(TNodoGen),(void **)&(p->pHijos));
for (i=0;i<p->nHijos;i++){
ArbolGenLee(pfic,&(p->pHijos[i]));
}
}
Prof. Jos A. Rodrguez Mondjar
Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 5

Arboles

Programacin en C

Salvar e imprimir rbol genealgico

void ArbolGenSalva(FILE *pfic, TNodoGen *p){


int i;
fprintf(pfic,"%s\n",p->sNom);
fprintf(pfic,"%d\n",p->nHijos);
for(i=0;i<p->nHijos;i++)
ArbolGenSalva(pfic,p->pHijos+i);
}

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 6

Arboles

Programacin en C

Imprimir rbol de forma ms elegante


void ArbolGenImp(FILE *pfic, TNodoGen *p){
int i;
fprintf(pfic,"%s",p->sNom);
if (p->nHijos>0) {
fprintf(pfic,":");
for(i=0;i<p->nHijos;i++) {
fprintf(pfic," %s",p->pHijos[i].sNom);
}
fprintf(pfic,"\n");
for(i=0;i<p->nHijos;i++) {
if (p->pHijos[i].pHijos>0)
ArbolGenImp(pfic,p->pHijos+i);
}
}
}

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 7

Arboles

Programacin en C

Borrar rbol

void ArbolGenBorra(TNodoGen *p)


{
int i;

Primero borrar los hijos


si los hay

for(i=0;i<p->nHijos;i++) {
ArbolGenBorra(p->pHijos+i);
}
MemLibera(&(p->nHijos),sizeof(TNodoGen),
(void **)&(p->pHijos));
}

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 8

Arboles

Programacin en C

Programa de prueba
main()
{
FILE *pfic;
TNodoGen Padre;

// Nodo padre

MemIni();
fprintf(stdout,"Memoria inicial %ld\n",MemConsulta());
if ((pfic=fopen("gen.txt","r"))==NULL)
return 1;
ArbolGenLee(pfic,&Padre);
ArbolGenSalva(stdout,&Padre);
ArbolGenImp(stdout,&Padre);
ArbolGenBorra(&Padre);
fprintf(stdout,"Memoria final %ld\n",MemConsulta());
return 0;
}
Prof. Jos A. Rodrguez Mondjar
Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 9

Arboles

Programacin en C

Resultados del programa de prueba


Memoria inicial 0
Pedro
2
Antonio
3
Carmen
0
Rafael
0
Gloria
0
Fernando
1
Juan
2
Maria
0
Juana
0
Pedro: Antonio Fernando
Antonio: Carmen Rafael Gloria
Fernando: Juan
Juan: Maria Juana
Memoria final 0

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 10

Arboles

Programacin en C

Otro ejemplo: gestin de un sistema grfico

Primitivas de dibujo:

Ventana

Punto.
Recta.
Polgono.
Crculo

Ventana1

Primitivas de organizacin

Ventana10

Ventana

Ventana0

Prof. Jos A. Rodrguez Mondjar


Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 11

Arboles

Programacin en C

Estructuras para el sistema grfico


typedef enum {Recta, Triangulo, SplineLin, Poligono, Circulo}
TClaseFigura;
typedef struct {
int x;
int y;
} TPto;

Punto
Figura

typedef struct {
int n;
TPto *pPto;
TClaseFigura Clase;
} TFigura;
typedef struct TVentana{
TPto Pos[2];
int nFig;
TFigura *pFig;
int nVenHijas;
struct TVentana *pHijas;
} TVentana;
Prof. Jos A. Rodrguez Mondjar
Prof. lvaro Snchez Miralles

Dice como tratar los


puntos de la figura
Ventana con
figuras y
subventanas

UPCO ICAI Departamento de Electrnica y Automtica 12

También podría gustarte