Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- struct nodo{char info; nodo* left,*right; nodo(int a=0, nodo*b=0,nodo*c=0){info=a; left=b; right=c;}};
- int profondita(nodo* T){
- if(!T)
- return -1;
- int TS= profondita(T->left);
- int TD = profondita(T->right);
- if(TS>TD)
- return 1+TS;
- else
- return 1+TD;
- }
- //parse
- nodo* parse(char*& A)
- {
- if(*A>='a' && *A<='z')
- {
- char p=*A;
- if(*(A+1) !='(') throw (1);
- A=A+2;
- nodo*l=parse(A);
- if(*A != ',') throw (2);
- A=A+1;
- nodo*r=parse(A);
- if(*A !=')') throw(3);
- A=A+1;
- return new nodo(p,l,r);
- }
- else
- if(*A=='_') {A=A+1;return 0;}
- else
- throw (4);
- }
- //foglia a profidità minima
- void fogliaminima(nodo* T, int prof, int & minprof, nodo *& minleaf){
- if(T){
- if(!T->left && !T->right){ //è una foglia; non ha figli, prof inizialmente uguale a zero da main
- minprof=prof;
- minleaf=T;
- }
- //se invcece ha figli, ci chiediamo se sono foglie
- fogliaminima(T->left,prof++,minprof,minleaf);
- //controllo per ordine infisso
- if(minprof==profondita(T)){
- return;}
- fogliaminima(T->right,prof++,minprof,minleaf);
- }
- }
- main()
- try
- {
- char A[100],y,*q=A;
- while(y!='$')
- {
- cin>>y;
- *q=y;
- q++;
- }
- q=A;
- nodo* R=parse(q);
- cout<<"start"<<endl;
- int a;
- nodo*b=0;
- fogliaminima(R,0,a,b);
- if(a==1)
- cout<<"prof="<<a+1<<" info foglia="<< b->info<<endl;
- else
- cout<<"prof="<<a<<" info foglia="<< b->info<<endl;
- cout<<"end"<<endl;
- }
- catch(int x)
- {
- switch(x)
- {
- case 1: cout<<"manca ("<<endl; break;
- case 2: cout<<"manca ," <<endl; break;
- case 3: cout<<"manca )"<<endl; break;
- case 4: cout<<"non albero"<<endl; break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement