Важно отметить, что элементу не нужно знать структуру дерева, поскольку он содержит только указатель на него. То же самое для дерева. Все, что нужно знать каждому, - это то, что существует тип с соответствующим именем, а не то, что в нем.
Так в tree.h вместо:
#include "element.h"
сделать:
typedef struct element_ element;
Это "объявляет" типы "element" и "struct element_" (говорит, что они существуют), но не "определяет" их (говорит, что они есть). Все, что вам нужно для хранения указателя на бла, это то, что бла объявлена, а не определена. Только если вы хотите почтить его (например, чтобы прочитать участников), вам нужно определение. Код в вашем файле ".c" должен сделать это, но в этом случае ваши заголовки не делают.
Некоторые люди создают один заголовочный файл, который заранее объявляет все типы в кластере заголовков, и затем каждый заголовок включает это вместо того, чтобы определять, какие типы ему действительно нужны. Это ни существенно, ни совершенно глупо.
Ответы о включенных охранниках неверны - в общем, это хорошая идея, и вы должны прочитать о них и получить немного, но они не решают вашу проблему в частности.