Binary tree (S-Expression) pretty printer
Disclaimer: I am a C++ coder, but I researched to make sure none of that made it into this advise.

It looks alright, there are a couple little things.


First, explicitly state that main() takes no arguments.  This is applicable to all functions in C:

int main(void)

leaf should take an argument of Leaf rather than unsigned long, this means that you will only have one line to change if you ever want your tree to hold something else.

Tree leaf(Leaf x)

Either use &lt;stdbool.h&gt; if on a C99 compiler, or explicitly define true and false rather than just using 1 and 0. This will make your code more self documenting.

#include &lt;stdbool.h&gt;

#define true 1
#define false 0

Again, if using &lt;stdbool.h&gt;, use the bool type or roll your own:

typedef int bool

If you are using C11 then you can use anonymous unions to simplify your TreeStruct.  It will also mean you can remove the now superfluous .value throughout your code.

struct TreeStruct
{
    bool isNode;
    union
    {
        Node node;
        Leaf leaf;
    };
};

You don't actually use the isRoot value passed to print, but it can be used to print a newline at the end.

void print(Tree * tree, bool isRoot)
{
    if (!tree-&gt;isNode)
    {
        printf("%lu", tree-&gt;leaf);
        return;
    };

    printf("(");
    print(tree-&gt;node.left, false);
    printf(" ");
    print(tree-&gt;node.right, false);
    printf(")");

    if (isRoot)
    {
        printf("\n");
    }
};

As a matter of personal preference, I like to space things out a bit more, as you can see above.