Advertisement
Jerkiller

nero/bianco

Jan 27th, 2015
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.36 KB | None | 0 0
  1.  
  2. /*
  3. Esempio A
  4.  
  5.         3
  6.        /  \
  7.       4    -1
  8.           /  \
  9.          2    -1
  10.         /     /
  11.        8     7  
  12. Nodi centrali attesi = 3:
  13. key 1° nodo -> 3
  14. key 2° nodo -> -1
  15. key 3° nodo -> -1
  16.        */
  17. /*
  18. Esempio B
  19.                  -1
  20.                  / \
  21.             ->  2   3  <-
  22.                     /
  23.                    0  <-
  24.                   / \
  25.                  5   4
  26. */
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29.  
  30. struct node{
  31.   int key;
  32.   struct node * p;
  33.   struct node * left;
  34.   struct node * right;
  35. };
  36.  
  37. typedef struct node * Node;
  38.  
  39. Node newnode(int);
  40. void visitPreOrder(Node);
  41. void visitSimmetrica(Node);
  42. void visitPostOrder(Node);
  43. void esProp1(Node, int);
  44. void esProp2(Node, int*);
  45. Node costruzioneEs12();
  46. int contaNodiCentrali(Node, int, int*);
  47.  
  48. int main(){
  49.   int numFoglie;
  50.   int sumCammino = 0;
  51.   int nodiCentrali;
  52.   Node /*es12,*/ esB;
  53.   /*es12 = costruzioneEs12();*/
  54.   esB = newnode(-1);
  55.   esB->left = newnode(2);
  56.   esB->right = newnode(3);
  57.   esB->right->left = newnode(0);
  58.   esB->right->left->left = newnode(5);
  59.   esB->right->left->right = newnode(4);
  60.  
  61.   /* ******************************** */
  62.   /*printf("\n*** Esercizio anno 2012    ***\n");*/
  63.   /*visitPreOrder(es12);*/
  64.   /*visitSimmetrica(es12);*/
  65.   /*visitPostOrder(es12);*/
  66.  
  67.   /*printf("\n*** Esercizio propedeutico 1°   ***\n");
  68.   esProp1(root, sumCammino);*/
  69.  
  70.   /*printf("\n*** Esercizio propedeutico 2   ***\n");
  71.   esProp2(root, &numFoglie);
  72.   printf("Le foglie dell'albero sono: %d\n", numFoglie);
  73.   */
  74.    
  75.   /*printf("\n*** Esercizio propedeutico 2   ***\n");
  76.   esProp2(root, &numFoglie);
  77.   printf("Le foglie dell'albero sono: %d\n", numFoglie);*/
  78.  
  79.   /*viewPreOrder(es12);*/
  80.   /*viewSimmetrica(es12);*/
  81.   /*viewPostOrder(es12);*/
  82.  
  83.   /*printf("\n*** Esercizio 12   ***\n");
  84.   viewSimmetrica(es12);
  85.   printf("\n");
  86.   esProp1(es12, sumCammino);*/
  87.   /* ******************************** */
  88.   /* ******************************** */
  89.   printf("\n*** Esercizio anno 2014   ***\n");
  90.   /*visitPreOrder(esB);*/
  91.   visitSimmetrica(esB);
  92.   /*visitPostOrder(esB);*/
  93.   nodiCentrali = contaNodiCentrali(esB, sumCammino, &numFoglie);
  94.   printf("Nell' esB i nodi centrali sono: %d", nodiCentrali);
  95.   /* ******************************** */
  96.   printf("\nThe end\n");
  97.   return 0;
  98. }
  99.  
  100. Node costruzioneEs12(){
  101.   Node radice = (Node) malloc(sizeof(struct node));
  102.   radice->p = NULL;
  103.   radice->key = 3;
  104.   radice->left = (Node) malloc(sizeof(struct node));
  105.   radice->left->p = radice;
  106.   radice->left->key = 4;
  107.   radice->left->left = NULL;
  108.   radice->left->right = NULL;
  109.   radice->right = (Node) malloc(sizeof(struct node));
  110.   radice->right->p = radice;
  111.   radice->right->key = -1;
  112.   radice->right->left = (Node) malloc(sizeof(struct node));
  113.   radice->right->left->p = radice->right;
  114.   radice->right->left->key = 2;
  115.   radice->right->right = (Node) malloc(sizeof(struct node));
  116.   radice->right->right->p = radice->right;
  117.   radice->right->right->key = -1 ;
  118.   radice->right->right->right = NULL;
  119.   radice->right->left->left =  (Node) malloc(sizeof(struct node));
  120.   radice->right->left->left->p = radice->right->left;
  121.   radice->right->left->left->key = 8;
  122.   radice->right->left->left->left = NULL;
  123.   radice->right->left->left->right = NULL;
  124.   radice->right->right->left = (Node) malloc(sizeof(struct node));
  125.   radice->right->right->left->key = 7 ;
  126.   radice->right->right->left->p = radice->right->right->left;
  127.   radice->right->right->left->left = NULL;
  128.   radice->right->right->left->right = NULL;
  129.   return radice;
  130. }
  131.  
  132.  
  133.  
  134. Node newnode(int value){
  135.   Node node  =  (Node) malloc(sizeof(struct node));
  136.   node->key  =  value;
  137.   node->p = NULL;
  138.   node->left  =  NULL;
  139.   node->right  =  NULL;
  140.   return node;
  141. }
  142.  
  143.  
  144.  
  145. void visitPreOrder(Node n){
  146.   if (n!=NULL)
  147.   {
  148.     printf("%d\n", n->key);
  149.     visitPreOrder(n->left);
  150.     visitPreOrder(n->right);
  151.   }
  152. }
  153.  
  154. void visitSimmetrica(Node n){
  155.   if (n!=NULL)
  156.   {
  157.     visitSimmetrica(n->left);
  158.     printf("%d\n", n->key);
  159.     visitSimmetrica(n->right);
  160.   }
  161. }
  162.  
  163. void visitPostOrder(Node n){
  164.   if (n!=NULL)
  165.   {
  166.     visitPostOrder(n->left);
  167.     visitPostOrder(n->right);
  168.     printf("%d\n", n->key);
  169.   }
  170. }
  171.  
  172.  
  173. /* *** Eserciz propedeutici  *** */
  174. void esProp1(Node n, int sum){
  175.   if(n==NULL)
  176.     return;
  177.   /*else if(n->left==NULL && n->right==NULL)
  178.   {
  179.     printf("%d\n", sum+n->key);
  180.     return;
  181.   }*/  
  182.   else
  183.   {
  184.     esProp1(n->left, sum+n->key);
  185.     esProp1(n->right, sum+n->key);
  186.     printf("%d\n", sum+n->key);
  187.     return;
  188.   }
  189. }
  190.  
  191. /* *** Esercizio propedeutico 2 *** */
  192. void esProp2(Node n, int *num){
  193.   int numSx, numDx;
  194.   numSx = *num;
  195.   numDx = *num;
  196.   if(n==NULL)
  197.   {
  198.     *num = 0;    
  199.   }
  200.   else if(n->left==NULL && n->right==NULL)
  201.   {
  202.     *num = 1;    
  203.   }
  204.   else
  205.   {
  206.     esProp2(n->left, &numSx);
  207.     esProp2(n->right, &numDx);
  208.     *num = numSx+numDx;
  209.   }
  210. }
  211.  
  212. int contaNodiCentrali(Node r, int sum, int* foglie){
  213.   int nodi, nodiSx, nodiDx, numFSx, numFDx;
  214.   if(r==NULL){
  215.     *foglie=0;
  216.     return 0;
  217.   }
  218.   else if(r->left==NULL && r->right==NULL){
  219.     *foglie = 1;
  220.     if(sum+r->key == 1)
  221.       return 1;
  222.     return 0;
  223.   }
  224.   else{
  225.     nodiDx = contaNodiCentrali(r->left,sum+r->key, &numFSx);
  226.     nodiSx = contaNodiCentrali(r->right,sum+r->key, &numFDx);
  227.     *foglie = numFSx+numFDx;
  228.     nodi = nodiSx + nodiDx;
  229.     if(sum + r->key == *foglie)
  230.       nodi++;
  231.     return nodi;
  232.   }
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement