Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/12/2007, 15:48
jessica89
 
Fecha de Ingreso: noviembre-2007
Mensajes: 1
Antigüedad: 16 años, 6 meses
Puntos: 0
Pregunta Re: Hola, soy nueva please ayuda

Hola chicos, estoy en el equipo con caro...

Bien, hemos estado buscando por varios dias por internet pero hay muy pocas paginas que expliquen super bien los arboles binarios o al menos, como utilizarlos con texto.

Tengo una implementación de un árbol binario (para introducir numeros) con algunas modificaciones mias, no le presten atención a todas las funciones (sobre todo la de espejo, creo que no funciona muy bien)

Código:
#include <iostream>

// Declaracion de la árbol


struct node{
   int info;
   struct node *izq, *der, *padre;
};

typedef struct node *nodePtr;
nodePtr arbol = NULL;


// Obtener memoria para un nodo nuevo
nodePtr getNode(void){
    nodePtr p;
    p=(nodePtr)malloc(sizeof(struct node));
    return(p);
}


// Liberar la memoria ocupada por un nodo
void freeNode(nodePtr p){
   free(p);
}

// Función para crear un nodo
nodePtr makeTree(int x){
  nodePtr p;
  p = getNode();
  p->info = x;
  p->izq = NULL;
  p->der = NULL;
  p->padre = NULL;
  return p;
}

//Establecer un nodo como hijo izquierdo de p
void setIzq(nodePtr p, int x){
  if(p == NULL)
     std::cout<<"Insercion nula\n";
    else
     if(p->izq != NULL)
       std::cout<<"Insercion no valida\n";
      else {
       	   p->izq=makeTree(x);
	   p->izq->padre = p;
	}
}

//Establecer un nodo como hijo derecho de p
void setDer(nodePtr p, int x){
  if(p == NULL)
     std::cout<<"Insercion nula\n";
    else
     if(p->der != NULL)
       std::cout<<"Insercion no valida\n";
      else {
       	   p->der=makeTree(x);
	   p->der->padre = p;
	}
}




// Recorrido pre-orden
void preTr(nodePtr tree){
    if (tree != NULL){
       std::cout << tree->info << ", ";
       preTr(tree->izq);
       preTr(tree->der);
    }
}

// Espejo de recorrido pre-orden

void preTrEsp(nodePtr tree) {
nodePtr p;
    if (tree != NULL){

    p = tree->izq;
    tree->izq = tree->der;
    tree->der = p;
    std::cout << tree->info << ", ";
    preTrEsp(tree->izq);
    preTrEsp(tree->der);
  }
}

// Recorrido en-orden
void inTr(nodePtr tree){
    if (tree != NULL){
       inTr(tree->izq);
       std::cout << tree->info << ", ";
       inTr(tree->der);
    }
}

// Recorrido post-orden
void postTr(nodePtr tree){
    if (tree != NULL){
       postTr(tree->izq);
       postTr(tree->der);
       std::cout << tree->info << ", ";
    }
}


void insertNode(int x) {

  nodePtr p,q;

  if (arbol ==  NULL) {
	arbol=makeTree(x);
  }
  else {

    p=q=arbol;

    while(x != p->info && q != NULL){
      p=q;
      if( x < p->info)
        q = p->izq;
      else
        q = p->der;
    }

     if (x < p->info)
       setIzq(p,x);
      else
       setDer(p,x);
  }
}


// Liberar la memoria ocupada por todo el árbol
void delete_all(void){
}



// Programa principal
int main(int argc, char* argv[]) {

  char c;
  int numero;


do{
	printf("Entre la opción deseada [insertar a la (i)zquierda | insertar a la (d)erecha | (l)ist | (q)uit]: ");
	scanf("%s", &c);

	switch (c) {
	  case 'i':
		  printf("Entre  un numero: ");
		  scanf("%d", &numero);
		  insertNode(numero);
		  printf("Se insertó satisfactoriamente el numero %d en la lista.\n", numero);
		break;
	  case 'l':

// Contar nodos
int contarNodos (nodePtr arbol);{
    if(arbol==NULL){
        return 0;
}
else{

    }
}

		  printf("Recorrido en pre-orden: ");
		  preTr(arbol);
		  printf("\n");

		  printf("Recorrido en pre-orden espejo: ");
		  preTrEsp(arbol);
		  printf("\n");

		  printf("Recorrido en-orden: ");
		  inTr(arbol);
		  printf("\n");

		  printf("Recorrido en post-orden: ");
		  postTr(arbol);
		  printf("\n");
		break;
	  case 'q':
		  delete_all();
		  std::cout << "Ãrbol borrado satisfactoriamente\n";
	}
  } while (c != 'q');

  return 0;
}
Ahora, se supone queeeee emm... tiene que poderse hacer esto:

Adicionar nuevos miembros a la jerarquia, indicando el padre
Visualizar todos los descendientes de una persona dada
Visualizar los hermanos y primos hermanos de una persona dada
Visualizar todos los ancestros de una persona dada

Para empezar, no tengo ni la menor idea como meter texto en un arbol binario, ese programa solo sirve con numeros

Segundo, no se como voy a meter los datos a mano, para ponerlos en el arbol como yo quiera..

En alguna parte del codigo vi que los metia ya sea a la izq o a la derecha, supongo que si separo esa parte en 2 funciones al menos ya puedo escoger en que lado las pongo?

Me refiero a esta parte:

Código:
    
while(x != p->info && q != NULL){
      p=q;
      if( x < p->info)
        q = p->izq;
      else
        q = p->der;
    }

     if (x < p->info)
       setIzq(p,x);
      else
       setDer(p,x);
Sea el caso que sea, tampoco tengo idea de como modificarlo.

Gracias por adelantado!