Sei sulla pagina 1di 2

Algoritmo per deallocare alcuni nodi: nel main(){ Head=sfrondalista(Head);

lista sfrondalista( lista b ) {


if ( b != NULL ) {
lista tmp = sfrondalista( b->next );
if ( condizioni affinch il nodo puntato da b sia da rimuovere) {
free( b ); return tmp;
}
else b->next = tmp;
}
return b;
}

int trovamin(tree t, int a, int curmin){


//minima differenza tra un numero (a) e un
int tempmin=0, curmins=0, curmind=0; // nodo qualsiasi dellalbero binario
if(t==NULL)
return curmin;
//curmin va definito preventivamente come diff
tempmin=diff(t->dato, a);
// tra il primo numero e il secondo (per esempio)
if (tempmin<curmin)
curmin=tempmin;
curmins=trovamin(t->left, a, curmin);
curmind=trovamin(t->right, a, curmin);
return min3(curmin, curmins, curmind);
}

Si consideri la seguente definizione di un albero binario:


typedef struct EL { int dato;
struct EL * left, * right; } node;
typedef node * tree;
Implementare una funzione che, ricevuto in ingresso un albero binario contenente solo valori positivi,
restituisca la differenza minima tra i valori di due nodi qualsiasi dellalbero. consigliato implementare
funzioni di supporto.
#include <stdio.h>
#include <stdlib.h>
typedef struct Al{
int dato;
struct Al *left, *right;
}Nodo;
typedef Nodo * tree;
int diff(int a, int b){
if (a>b)
return a-b;

return b-a;

int min(int a, int b){


if(a<b)
return a;
return b;
}
int min3(int a, int b, int c){
return min(a, min(b, c));
}
int trovamin(tree t, tree t1, int curmin){
int tempmin=0, curmins=0, curmind=0;
if(t==NULL || t1==NULL)
return curmin;
tempmin=diff(t->dato, t1->dato);
if (tempmin<curmin && t!=t1)
curmin=tempmin;
curmins=trovamin(t->left, t1, curmin);
curmind=trovamin(t->right, t1, curmin);
return min3(curmin, curmins, curmind);
}
int trovamintot(tree t1, tree t2, int a, int curmin){
int curmins=0, curmind=0;
if(t1==NULL || t2==NULL)
return curmin;
curmins=trovamintot(t1->left, t2, t1->dato, trovamin(t2, t1, curmin));
curmind=trovamintot(t1->right, t2, t1->dato, trovamin(t2, t1, curmin));
return min3(curmin, curmins, curmind);
}
int inseriscival(tree t){
if(t==NULL)
exit(1);
if(t->left==NULL && t->right==NULL)
exit(1);
if(t->left!=NULL)
return diff(t->dato, t->left->dato);
return diff(t->dato, t->right->dato);
}
int main() {
tree t=NULL;
int a=0, num=0;
dichiarazione albero
num=inseriscival(t);
a=trovamintot(t, t, t->dato, num);
return 0;
}

Potrebbero piacerti anche