关于callback函数

求助:关于callback函数
这个例子是在《C和指针》上看到的。我有问题的地方是红色部分的“前序遍历”,那个部分没看懂。如果我想用printf输出前序遍历的值,应该怎么写?

新手先谢谢各位了!




/*
** 一个使用静态数组实现的二叉搜索树。
** 数组的长度只能通过修改#define定义。
** 对模块进行重新编译来实现。
*/
#include "tree.h" //树头文件
#include <assert.h>
#include <stdio.h>

#define TREE_SIZE 100
#define ARRAY_SIZE (TREE_SIZE + 1)

static TREE_TYPE tree[ARRAY_SIZE];

//计算一个节点左孩子的下标。
static int left_child(int current){
return current * 2;
}

//计算一个节点右孩子的下标。
static int right_child(int current){
return current * 2 + 1;

}

//插入
void insert(TREE_TYPE value){
int current;
assert( value != 0 ); //确保值为非零,因为零用于提示一个未使用的节点。
current = 1; //从根节点开始。

while( tree[current] != 0 ){
/*
** 根据情况,进入叶节点或者右子树。
*/
if(value < tree[current])
current = left_child(current);
else{
assert( value != tree[current]); //不允许相同值插入。
current = right_child( current );
}
assert( current < ARRAY_SIZE );
}
tree[current] = value;
}

TREE_TYPE *find(TREE_TYPE value){
int current;
current = 1; //从根节点开始查找。直到找到指定值,进入合适的子树。

while( current < ARRAY_SIZE && tree[current] != value){
/*
** 根据情况,进入左子树或右子树。
*/
if(value < tree[current])
current = left_child(current);
else
current = right_child(current);
}
if(current < ARRAY_SIZE)
return tree + current;
else
return 0;
}

/*
** 执行一层前序遍历,这个帮助函数用于保存我们当前
** 正在处理的节点信息,它并不是用户接口的一部分。
*/
static void do_pre_order_traverse(int current, void (*callback)(TREE_TYPE VALUE))
{
if(current < ARRAY_SIZE && tree[current] != 0){
callback( tree[ current ] );
do_pre_order_traverse(left_child( current ), callback);
do_pre_order_traverse(right_child( current ), callback);
}

}

void pre_order_traverse(void (*callback)(TREE_TYPE value)){ //前序遍历二叉树。参数为回调函数指针。
do_pre_order_traverse(1,callback);
printf("%d\n",*callback);
}

int main(void){
TREE_TYPE a;
int i;
for(i = 0 ; i < 5 ; i++){
scanf("%d",&a);
insert(a);
}

return 0;
}

------解决方案--------------------
typedef TYPE_VALUE int;
void print(TYPE_VALUE i)
{
printf("%d ",i);
}
int main(void){
 TREE_TYPE a;
 int i;
 for(i = 0 ; i < 5 ; i++){
 scanf("%d",&a);
 insert(a);
 }
 pre_order_traverse(print);
return 0;
}