Advertisement
Guest User

es5.6

a guest
Jan 17th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. struct nodo{char info; nodo* left,*right; nodo(int a=0, nodo*b=0,nodo*c=0){info=a; left=b; right=c;}};
  5.  
  6. int profondita(nodo* T){
  7.     if(!T)
  8.     return -1;
  9. int TS= profondita(T->left);
  10. int TD = profondita(T->right);
  11.     if(TS>TD)
  12.     return 1+TS;
  13.    
  14.     else
  15.     return 1+TD;
  16. }
  17.  
  18.  
  19. //parse
  20. nodo* parse(char*& A)
  21. {
  22.   if(*A>='a' && *A<='z')
  23.     {
  24.       char p=*A;
  25.       if(*(A+1) !='(') throw (1);
  26.       A=A+2;
  27.       nodo*l=parse(A);
  28.       if(*A != ',') throw (2);
  29.       A=A+1;
  30.       nodo*r=parse(A);
  31.       if(*A !=')') throw(3);
  32.      
  33.       A=A+1;
  34.       return new nodo(p,l,r);
  35.     }
  36.   else
  37.     if(*A=='_') {A=A+1;return 0;}
  38.     else
  39.       throw (4);
  40. }
  41.  
  42.  
  43. //foglia a profidità minima
  44. void fogliaminima(nodo* T, int prof, int & minprof, nodo *& minleaf){
  45.    
  46.     if(T){
  47.        
  48.         if(!T->left && !T->right){ //è una foglia; non ha figli, prof inizialmente uguale a zero da main
  49.             minprof=prof;
  50.             minleaf=T;
  51.         }
  52.        
  53.     //se invcece ha figli, ci chiediamo se sono foglie
  54.     fogliaminima(T->left,prof++,minprof,minleaf);
  55.    
  56.      //controllo per ordine infisso
  57.     if(minprof==profondita(T)){
  58.     return;}
  59.  
  60.     fogliaminima(T->right,prof++,minprof,minleaf);
  61.     }
  62. }
  63.  
  64.  
  65.  
  66. main()
  67. try
  68.   {
  69.     char A[100],y,*q=A;
  70.    
  71.     while(y!='$')
  72.       {
  73.     cin>>y;
  74.     *q=y;
  75.     q++;
  76.       }
  77.     q=A;
  78.     nodo* R=parse(q);
  79.     cout<<"start"<<endl;
  80.     int a;
  81.     nodo*b=0;
  82.     fogliaminima(R,0,a,b);
  83.     if(a==1)
  84.     cout<<"prof="<<a+1<<" info foglia="<< b->info<<endl;
  85.     else
  86.     cout<<"prof="<<a<<" info foglia="<< b->info<<endl;
  87.     cout<<"end"<<endl;
  88.   }
  89.  catch(int x)
  90.    {
  91.      switch(x)
  92.        {
  93.        case 1: cout<<"manca ("<<endl;   break;
  94.        case 2: cout<<"manca ," <<endl; break;
  95.        case 3: cout<<"manca )"<<endl;   break;
  96.        case 4: cout<<"non albero"<<endl;   break;
  97.        }
  98.  
  99.    }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement