codice:
	#include <stdio.h>#include <stdlib.h>
typedef struct NODE {
	int key;
	struct NODE *left;
	struct NODE *right;
	struct NODE *up;
} NODE;
int pivot(int *A,int p,int r){
    return p+rand()%(r-p+1);
}
  
void swap(int *A,int i, int j){
     int tmp; 
     tmp=A[i];
     A[i]=A[j];
     A[j]=tmp;
}
  
int partition(int *A,int p,int q,int r){
    int i=p, j=r,pivot;
    swap(A,q,p);
    pivot=A[p];
    while(i<j){
               while(j>p && pivot<=A[j]){
                         j--;
               }
               while(i<r && pivot>A[i]){
                         i++;
               }
               if(i<j){
                       swap(A,i,j);
               }
    }
    swap(A,p,j);
    return j;
} 
void quicksort(int *A,int p,int r){
     if (p<r){
        int q=pivot(A,p,r);
        int i=partition(A,p,q,r);
        quicksort(A,p,i);
        quicksort(A,i+1,r);
     }
}
  
NODE *NodeAlloc(int key) {
	NODE *node = (NODE *)malloc(sizeof(NODE));
	node ->key  = key;
	node ->left = NULL;
	node->right = NULL;
	node->up    = NULL;
	return node;
}
NODE* Alb(int* list, int j, int u){
	int m;
	NODE *nodo;
	if (j<=u){
		m = ((j + u) / 2);
		nodo = NodeAlloc(list[m]);
		nodo->left = Alb(list, j, m - 1);
		nodo->right = Alb(list, m + 1, u);
		return nodo;
	}
	else
		return NULL;
}
NODE *BalancedBST(int *list, int n) {
	NODE *T = NULL;
	int k;
	k = n - 1;
	quicksort(list, 0, k);
	T = Alb(list, 1, n);
	return T;
}
void PreOrderPrint(NODE *T) {
	if(T!=NULL){
                 printf("%d ",T->key);
                 PreOrderPrint(T->left);
                 PreOrderPrint(T->right);
     } 
}
void DeleteBST(NODE *T) {
	if(T!=NULL){
                 DeleteBST(T->left);
                 DeleteBST(T->right);
                 free(T);
     } 
}
int main() {
	int list[]={8, 5, 18, 15, 17, 9, 7, 16},n=8;
	NODE *T;
	
	T = BalancedBST(list,n);
	PreOrderPrint(T);
	DeleteBST(T);
	return 0;
}