C/Visual C - recorrido por amplitud de un árbol en C

 
Vista:

recorrido por amplitud de un árbol en C

Publicado por frustrated (1 intervención) el 20/11/2004 16:54:13
Esto lo tengo que entragar el lunes a las 10 am, a ver si pueden ayudarme antes de eso...

El caso es que inserto nodos en un árbol binario balanceado... eso ya lo tengo...

Pero tengo que hacer el recorrido por amplitud del árbol e ir imprimiendo los nodos... (recorrido por amplitud es por niveles, primero la raiz, luego los nodos del siguiente nivel, luego los del siguiente nivel.. etc..)

Les paso el código que tengo...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdio.h"
#include "stdlib.h"
 
struct nodos{
     int dato; //dato que se almacenara en el nodo, este dato puede ser de cualquier tipo, incluso un registro 
     struct nodos *der; //generacion de las ramas del arbol hacia la derecha 
     struct nodos *izq; //generacion de las ramas del arbol hacia la izquierda 
};
 
typedef struct nodos Arbol;
typedef Arbol *ARBOL;
 
void insertar(ARBOL*, int);
 
main(){
     char sino;
     int ele,x;
     ARBOL raiz=NULL;//raiz, es el inicio del arbol 
     printf("cuantos quieres insertar?");
     scanf("%d",&x);
     for (int y = 0; y<x y++) {
          printf("\nInsertar\n");
	  printf("\n\n\tIntroduce el elemento %d: ",y+1);
          scanf("%d", &ele);//lectura del elemento o dato a almacenar en el arbol 
          insertar(&raiz,ele);//se envia a la funcion la direccion del inicio del arbol y el elemento a insertar 
     }//for 
 
     return 0;
}
 
void insertar(ARBOL *nodoarb, int valor) {
     if (*nodoarb == NULL){ //Pregunta
          *nodoarb = new(Arbol); //malloc(sizeof(Arbol)); 
          if (*nodoarb != NULL){ //se crea el nuevo nodo del arbol y se almacenaran los datos 
               (*nodoarb)->dato=valor; //almacena el elemento que se envio 
               (*nodoarb)->der=NULL;
               (*nodoarb)->izq=NULL;
          }
          else
               printf("\n\tNo hay memoria suficiente\n");
     }
     else
          if (valor < (*nodoarb)->dato) //si el valor a almacenar es menor que el valor del dato colocado en la raiz 
               insertar (&((*nodoarb)->izq), valor); //lo inserta a la izquierda 
          else
               if (valor > (*nodoarb)->dato) //si es mayor 
                    insertar (&((*nodoarb)->der), valor);//lo almacena a la derecha 
               else
                    printf("\n\tDato duplicado\n");//no se pueden duplicar los datos 
}


Ok, entonces ya tengo un árbol binario balanceado... el problema es el recorrido por amplitud... tengo el algoritmo, pero no se como implementarlo... aqui se los paso a ver si alguien me puede echar una mano...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void amplitud(tarbol *a)
{
  tCola cola;   /* las claves de la cola serán de tipo árbol binario */
  arbol *aux;
 
  if (a != NULL) {
    CrearCola(cola);
    encolar(cola, a);
    while (!colavacia(cola)) {
      desencolar(cola, aux);
      visitar(aux);
      if (aux->izq != NULL) encolar(cola, aux->izq);
      if (aux->der != NULL) encolar(cola, aux->der);
    }
  }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

recorrido por amplitud de un árbol en C

Publicado por nikolai diaz (1 intervención) el 21/11/2014 19:36:35
tienes que recurrir a otra estructura por que ese tipo de recorrido no se puede hacer por recursion , si tienes una lista(cola) con las siguientes funciones .... crear lista vacía , agregar ultimo elemento , eliminar primer elemento y obtener primer elemento ...
el codigo que tienes creo que tiene un error por que antes de desencolar tienes que revisar tu nodo del arbol para determinar si tiene hijos , .
llamas la fucion anchura , creas una lista y luego insertas en ella el nodohijo que proviene del árbol , al entrar al while te consulta que mientras que esa lista no sea vacia va hacer lo siguiente : imprime el primer nodohijo que guardaste en la lista , verifica si tiene hijos izquierdo y derecho, si los tiene los guarda en la lista (cola) en las ultimas posiciones , y procede a eliminar el priemro que en esta caso ya imprimio.


nodoHIjo es un nodo que se trae del arbol binario



typedef struct Nodo
{
NodoHijo* archivo;
Nodo* Siguiente;
};

typedef struct Lista
{
int numElementos;
Nodo* Primero;
};

Lista* crearListaVacia ()
{
Lista* tmp = new Lista;
tmp -> numElementos=0;
tmp -> Primero= NULL;

return tmp;
}


void agregarUltimoElemento (Lista* l, NodoHijo* e)
{
Nodo* nodoTemp= new Nodo;
Nodo* Ultimo = new Nodo ;
Ultimo -> Siguiente = NULL ;
if ( l -> Primero == NULL)
{

l -> Primero = Ultimo;
Ultimo -> archivo = e;
}
else
{
nodoTemp -> Siguiente = l -> Primero;
while (nodoTemp -> Siguiente != NULL)
{
nodoTemp = nodoTemp -> Siguiente;

}
Ultimo -> archivo = e;
nodoTemp -> Siguiente = Ultimo;
Ultimo -> Siguiente = NULL;

}

l -> numElementos++;

}


void eliminarPrimerElemento (Lista* l)
{
if (l->Primero==NULL)
{

}

if (l->Primero!=NULL)
{
Nodo* nodoTmp = l -> Primero;
l -> Primero = l -> Primero -> Siguiente;
nodoTmp -> Siguiente = NULL;
l -> numElementos--;
}
}


NodoHijo* consultarPrimerElemento (Lista* l)
{
if (l ->Primero==NULL)
{
return NULL;
}
else
{

return l -> Primero ->archivo;
}
}





void ImprimirAnchura (NodoHijo* A )
{
if (A!= NULL)
{
Lista*milista=crearListaVacia();
agregarUltimoElemento(milista,A);
while (milista->Primero!=NULL)
{
NodoHijo* Imprime = consultarPrimerElemento(milista);
cout <<Imprime-> elemento<<"-";
if (Imprime->Izquierda!=NULL)
{
agregarUltimoElemento(milista,Imprime->Izquierda);

}
if (Imprime->Derecha!=NULL)
{
agregarUltimoElemento(milista,Imprime->Derecha);
}

eliminarPrimerElemento(milista);

}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

recorrido por amplitud de un árbol en C

Publicado por uno (1 intervención) el 22/06/2018 21:00:07
¿Por qué usas un "for" en una estructura dinámica?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar