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; }