Advertisement
juanjo12x

Camino_entre_nodos_Arbol

Jun 13th, 2014
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //Juanjose Tenorio PeΓ±a
  5. typedef struct nodo{
  6.     int valor;
  7.     struct nodo* ptrHI;
  8.     struct nodo* ptrHD;
  9. } TNodo;
  10. void crear_arbol(TNodo ** ptrRaiz);
  11. void inserta_nodo(TNodo **ptrRaiz, int valor);
  12. int Encontrar_camino(TNodo * , TNodo *, TNodo*);
  13. void crear_arbol(TNodo ** ptrRaiz){
  14.     *ptrRaiz = NULL;
  15. }
  16.  
  17. void inserta_nodo(TNodo **ptrRaiz, int valor){
  18.     TNodo *ptrHoja, *ptrRecorrido, *ptrPadre;
  19.     ptrHoja = (TNodo*)malloc(sizeof(TNodo));
  20.     ptrHoja->valor = valor;
  21.     ptrHoja->ptrHI=ptrHoja->ptrHD=NULL;
  22.    
  23.     if(*ptrRaiz){
  24.         ptrRecorrido = *ptrRaiz;
  25.         ptrPadre = NULL;
  26.        
  27.         while (ptrRecorrido){
  28.             ptrPadre = ptrRecorrido;
  29.             if (ptrRecorrido->valor > valor)
  30.                 ptrRecorrido = ptrRecorrido->ptrHI;
  31.             else
  32.                 ptrRecorrido = ptrRecorrido->ptrHD;                  
  33.         }
  34.         if (ptrPadre->valor > valor)
  35.             ptrPadre->ptrHI = ptrHoja;
  36.         else
  37.             ptrPadre->ptrHD = ptrHoja;
  38.     }
  39.     else{
  40.      *ptrRaiz = ptrHoja;  
  41.     }          
  42. }
  43. /*funcion que determina si los nodos pertenecen a hijos distintos*/
  44. int hijos_distintos(int v1,int v2,int vraiz){
  45.     if(v1<vraiz && v2>vraiz) return 1;
  46.     if(v2<vraiz && v1>vraiz) return 1;
  47.     return 0;
  48. }
  49. int hijo(int v1,int v2,int vraiz){
  50.       if(v1<vraiz && v2<vraiz) return 0;//hijo izquierdo
  51.       else{
  52.           return 1; //hijo derecho
  53.       }
  54. }
  55.  
  56. void Imprimir_Camino(TNodo*raiz , int padre,int hijo){
  57.     TNodo* ptrecorrido=raiz;
  58.    
  59.      while(ptrecorrido!=NULL && ptrecorrido->valor!=padre ){
  60.           if (ptrecorrido->valor > padre)
  61.                 ptrecorrido = ptrecorrido->ptrHI;
  62.             else
  63.                 ptrecorrido = ptrecorrido->ptrHD;  
  64.       }
  65.       //una vez encontrado padre comienzo la impresion
  66.       printf("%d -",padre);
  67.       while(ptrecorrido!=NULL && ptrecorrido->valor!=hijo ){
  68.           if (ptrecorrido->valor > hijo){
  69.                ptrecorrido = ptrecorrido->ptrHI;
  70.                printf("%d -",ptrecorrido->valor);
  71.             }   else{
  72.                ptrecorrido = ptrecorrido->ptrHD;  
  73.                printf("%d -",ptrecorrido->valor);
  74.             }
  75.                  
  76.       }    
  77.        
  78. }
  79. int Encontrar_camino(TNodo* raiz, TNodo *p1, TNodo*p2){
  80.     int v1,v2,vraiz,num;TNodo*ptrecorrido;
  81.     /*leo el valor de cada uno de los nodos*/
  82.     if (raiz==NULL){
  83.         printf("No existe camino\n");
  84.         return 0;
  85.     }
  86.     v1=p1->valor;
  87.     v2=p2->valor;
  88.     vraiz=raiz->valor;
  89.     if (hijos_distintos(v1,v2,vraiz)){
  90.         printf("No existe camino para dichos nodos\n");
  91.         return 0;
  92.     }else{
  93.         if(v1!=vraiz && v2!=vraiz){
  94.         num=hijo(v1,v2,vraiz);//verifico a que hijo pertenecen
  95.        
  96.         //num=0 es hijo izquierdo, num=1 es hijo derecho
  97.         if (num==0){
  98.             ptrecorrido=raiz->ptrHI;
  99.             //verifico quien puede ser el padre
  100.             if (v1>v2){
  101.                
  102.                 Imprimir_Camino(ptrecorrido,v2,v1);
  103.             }else{
  104.                 Imprimir_Camino(ptrecorrido,v1,v2);
  105.                 //verifico quien puede ser el padre
  106.                
  107.             }
  108.         }else{
  109.             ptrecorrido=raiz->ptrHD;
  110.             //verifico quien es el padre
  111.             if (v1>v2){
  112.                    
  113.                 Imprimir_Camino(ptrecorrido,v2,v1);
  114.             }else{
  115.                 Imprimir_Camino(ptrecorrido,v1,v2);
  116.                 //verifico quien puede ser el padre
  117.                
  118.             }
  119.         }
  120.         }else{//caso en que la raiz sea parte del camino
  121.              if (v1==vraiz){
  122.                 ptrecorrido=raiz;
  123.                 Imprimir_Camino(ptrecorrido,v1,v2);
  124.             }else{
  125.                  ptrecorrido=raiz;
  126.                 Imprimir_Camino(ptrecorrido,v2,v1);
  127.             }
  128.         }
  129.     }
  130.    
  131. }
  132. int main(int argc, char** argv) {
  133.     TNodo *ptrRaiz;TNodo *p1;TNodo *p2;
  134.     crear_arbol(&ptrRaiz);
  135.     inserta_nodo(&ptrRaiz, 15);
  136.     inserta_nodo(&ptrRaiz, 10);
  137.     inserta_nodo(&ptrRaiz, 17);
  138.     inserta_nodo(&ptrRaiz, 19);
  139.     inserta_nodo(&ptrRaiz, 16);
  140.     inserta_nodo(&ptrRaiz, 5);
  141.     inserta_nodo(&ptrRaiz, 14);
  142.     inserta_nodo(&ptrRaiz, 20);
  143.     inserta_nodo(&ptrRaiz, 21);
  144.     inserta_nodo(&ptrRaiz, 18);
  145.     /*creo 2 nodos*/
  146.     p1 = (TNodo*)malloc(sizeof(TNodo));
  147.     p1->valor = 17;
  148.     p1->ptrHI=p1->ptrHD=NULL;
  149.     /*-----*/
  150.     p2 = (TNodo*)malloc(sizeof(TNodo));
  151.     p2->valor = 21;
  152.     p2->ptrHI=p2->ptrHD=NULL;
  153.     //asumo que me dan valores validos para los nodos
  154.     //no me daran nodos que no existan ya que para eso
  155.     // tendria que implementar una funcion que verifique
  156.     // que existan
  157.     Encontrar_camino(ptrRaiz,p1,p2);
  158.     return (EXIT_SUCCESS);
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement