二叉排序树的递归中序遍历解决办法

二叉排序树的递归中序遍历
代码很简单,只有几行:
//递归输出二叉树(中序遍历)

       void InTraverse(BiTree &T){
if(T==NULL)
    return;
InTraverse(T->left); //递归遍历左子树
printf("%d ",T->data.key); //访问根结点
InTraverse(T->right); //递归遍历右子树
}

但不是很理解,它是怎样递归调用的?函数所创建的(临时)变量是怎样进栈的,然后又怎样返回?二叉树的左右子树是以怎样的顺序进栈的?又是怎样出栈的?能否举个简单的例子说明下?(例如下面的二叉树)
                      4
                 2    5
               1   3
二叉树 递归 中序遍历

------解决方案--------------------
我要分哦   首先到4,递归到2,因为2不为空,递归到1,因为1不为空到1的左子树,为空就返回到1,把1输出来,然后又递归到1的右子数,为空,返回到1,1这步走完了就返回到2,输出2,又去到2的右子树,3的情况和1相同,输出3,返回到4,输出4,去到4的右子树5,和1相同就输出5,就完了!!
------解决方案--------------------
刚开始进入函数的是 4
执行 4 的 left,递归

进入函数的是 2
执行 2 的 left ,递归

进入函数的是 1
执行 1 的 left,递归

进入函数的是NULL
返回 执行1的 left 的 下一句

输出 1
执行 1 的 right

进入函数的是NULL
返回 执行1的 right 的 下一句
返回到 执行 2 的 left 的下一句  

输出 2
执行 2 的 right

进入函数的是 3
............

这样一步步递归,返回,就完成了中序遍历

递归搞懂了就很容易理解,不懂的会看不明白。
------解决方案--------------------
1.自己手动模拟执行一遍
2.单步调试,看变量值变化,以及栈信息变化