Ciao wgd,

codice:
typedef struct tagTree
{
    int data;
    struct tagTree *left;
    struct tagTree *right;
} Tree;

/* Stampa l'albero in ordine crescente */
void InOrder(Tree * p)
{
	Tree *temp;

	Tree *stack[MAX_STACK];
	int top;
	top = -1;

	if ( !p )
		return;

	temp = p;

	while ( 1 )
	{
		if ( temp != NULL )
		{
			if ( top < MAX_STACK ) 
			{
				stack[++top] = temp; // Push
				temp = temp->left;
			}
			else
			{
				printf("Errore: lo stack e' pieno.\n");
				return;
			}
		}
		else
		{
			if ( top >= 0 )
			{
				temp = stack[top--]; // Pop 
				printf("%d\n", temp->data);			
				temp = temp->right;
			}
			else
			{
				break;
			}
		}
	}
}

/* Stampa l'albero in ordine decrescente */
void ReverseInOrder(Tree * p)
{
	Tree *temp;

	Tree *stack[MAX_STACK];
	int top;
	top = -1;

	if ( !p )
		return;

	temp = p;

	while ( 1 )
	{
		if ( temp != NULL )
		{
			if ( top < MAX_STACK ) // Push
			{
				stack[++top] = temp;
				temp = temp->right;
			}
			else
			{
				printf("Errore: lo stack e' pieno.\n");
				return;
			}
		}
		else
		{
			if ( top >= 0 )
			{
				temp = stack[top--]; // Pop 
				printf("%d\n", temp->data);			
				temp = temp->left;
			}
			else
			{
				break;
			}
		}
	}
}
La prima funzione utilizza uno stack per l'attraversamento dell'albero in ordine crescente. La seconda, ReverseInOrder, è simmetrica alla prima.