Every time you call a function, an area of memory called a stack is used to hold the context so that when the function exits you can continue from where you continued. It's called a stack, because it can hold many different function call contexts, and always adds a new context to the top when you call a function, and removes the last one from the top when you exit.
Suppose you have a tree:
A
/ \
B C
/ \
D E
You pass A to your function.
Is it null? No - Call it recursively with the right node: C. This stacks the context.
This time, you check if C is null. It isn't, so you recursively call the function passing it the C.Right node which is empty. This context gets stacks (so there are two contexts there now)
Check that against null. It is, so you return from the function immediately. Remove the top context, and restore it.
Execution continues from the statement immediately after the last call, where you were processing the C node. You print the Value "C" and repeat the process for the Left nodes.
Try it using the debugger, you'll soon get the idea!