Advertisement
akanoce

III_Tempo_AlberoBil

May 17th, 2018
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.60 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3. struct nodo{int info; nodo* left,*right; nodo(int a=0, nodo* b=0, nodo*c=0){info=a; left=b;right=c;}};
  4.  
  5. //PRE= (albero(r) è corretto e bilanciato
  6. int countN(nodo * r) {
  7.    
  8.     if(!r)
  9.         return 0;
  10.     else
  11.         return 1 + countN(r->left) + countN(r->right);
  12.  
  13.    
  14. }//count
  15. //POST=  La funzione restituisce il numero di nodi presenti nell'albero passato
  16.  
  17. //PRE=(albero(r) è corretto e bilanciato nel senso spiegato nell’Esempio 1, valbero(r)=albero(r))
  18. nodo* alberobil (nodo*r, int k) {
  19.    
  20.     if(!r)//Albero vuoto
  21.     return new nodo(k,0,0);
  22.     else{
  23.        
  24.         if(countN(r->left) > countN(r->right)){
  25.            
  26.             r->right= alberobil(r->right,k);
  27.            
  28.         }//Devo inserire a destra
  29.         else
  30.             r->left = alberobil(r->left,k);
  31.        
  32.         return r;
  33.        
  34.     }//albero non vuoto
  35.    
  36. }//alberobil
  37. //POST=(albero(r) è corretto e ancora bilanciato ed è ottenuto da valbero(r) aggiungendogli  una nuova foglia  con info=k)
  38. /* PROVA INDUTTIVA */
  39. /* --- CASO BASE ---
  40. 1) if(!r)
  41.             Sono in presenza di un albero vuoto--> ritorno il nuovo nodo dove ho inserito il campo k
  42.     --- CASO INDUTTIVO ---
  43. 1)if(countN(r->left)> countN(r->right))
  44.  
  45.     r->right= alberobil(r->right,k);
  46. //PRE_ric=(albero(r->right) è corretto e bilanciato nel senso spiegato nell’Esempio 1, valbero(r->right)=albero(r->right))
  47.    
  48.     Inserisco quindi il nuovo nodo nel sottoalbero(r) destro, in quanto #nodidx < #nodisx, che è corretto
  49.    
  50.     PRE_ric --> POST_ric
  51.    
  52. //POST_ric=(albero(r->right) è corretto e ancora bilanciato ed è ottenuto da valbero(r->right) aggiungendogli  una nuova foglia  con info=k)
  53.  
  54.  2)if(countN(r->left)<= countN(r->right))
  55.  
  56.     r->left= alberobil(r->left,k);
  57. //PRE_ric=(albero(r->left) è corretto e bilanciato nel senso spiegato nell’Esempio 1, valbero(r->left)=albero(r->left))
  58.    
  59.     Inserisco quindi il nuovo nodo nel sottoalbero(r) sinistro, in quanto #nodisx <= #nodidx, che è corretto
  60.     PRE_ric --> POST_ric
  61. //POST_ric=(albero(r->left) è corretto e ancora bilanciato ed è ottenuto da valbero(r->left) aggiungendogli  una nuova foglia  con info=k)  
  62.    
  63.    
  64.  
  65.  
  66.  
  67. --- FINE PROVA INDUTTIVA */
  68.  
  69. //PRE=(albero(r) è corretto e bilanciato, n>=0, valbero(r)=albero(r))
  70. nodo* buildtree(nodo* r, int n){
  71.    
  72.     if(n){
  73.         int k; cin>>k;
  74.        
  75.     r = alberobil(r,k);
  76.     return  buildtree(r,n-1);
  77.    
  78.     }//Ho nodi da aggiungere all'albero
  79.     else
  80.         return r;
  81.    
  82.    
  83.    
  84. }//buildtree
  85. //POST=(restituisce valbero(r) con n nodi aggiuntivi inseriti in modo da conservare il bilanciamento)
  86.  
  87. /* PROVA INDUTTIVA */
  88. /* ----- CASO BASE -----
  89. /*
  90. 1) if(!n) Non ho più nodi da aggiungere all'albero, quindi ritorno r che è l'albero costruito
  91.  
  92. --- CASO INDUTTIVO --
  93. 1)n>0 --> Ho ancora dei nodi da inserire nell'albero
  94.  
  95. //PRE_ric = Albero(r) è bilanciato e n-1 >=0 , valbero(r) = albero(r)
  96.  
  97. Pre ric vale dato che n>0 --> posso assumere post_ric
  98.  
  99. //POST_ric = (restituisce valbero(r) con n-1 nodi aggiuntivi inseriti in modo da conservare il bilanciamento
  100.  
  101. Che è corretto dato che ho costruito l'albero con 1 nodo, albero(r) sarà valbero(r) con n-1 nodi inseriti.
  102.  
  103.  --- FINE PROVA INDUTTIVA */
  104.  
  105. void stampa_l(nodo* R){
  106.  
  107. if(R){
  108. cout<<R->info<<"(";
  109. stampa_l(R->left);
  110. cout<<",";
  111. stampa_l(R->right);
  112. cout<<")";
  113.  
  114. }else
  115.     cout<<"_";
  116.    
  117.    
  118. }//stampa_L
  119. main()
  120. {
  121.   int n;
  122.   cin>>n;
  123.   nodo* R=buildtree(0,n);//da fare
  124.   cout<<"start"<<endl;
  125.   stampa_l(R); //da fare, vista in classe
  126.  
  127.   cout<<endl<<"end";
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement