在川神的点拨下，终于搞懂了这里不能用一级指针的原因

malloc()是在堆上分配空间，如果使用一级指针root，给root分配空间的语句就变成了
root = (bt_node_t *)malloc(sizeof(bt_node_t));
这时候对root的赋值是值传递，相当于给了函数内部root的副本，其无法影响到函数外部的root值。
如果是二级指针root，给root分配空间时的赋值操作
*root = (bt_node_t *)malloc(sizeof(bt_node_t));
它相当与直接对*root所表示的内存空间进行修改，在函数外部也是可见的。
这就好比函数void foo1(int x){x = y;}和void foo2(int &x){*x =
y;}，在foo1中对于x的赋值是对函数内部的x副本进行的，不影响函数外面的x；在foo2中，对于*x的赋值是直接在x所表示的内存空间上进行，在函数外部也是可见的。就是这个道理。
为什么不能使用一级指针

如果使用一级指针root，在函数内部对其进行的赋值实际上只是对root的副本赋值，而不能影响到函数外面的root。