Em mới học cấu trúc dữ liệu. gặp thắc mắc về con trỏ, các anh giải thích giùm em bài này với.

//CHUONG TRINH THUC HIEN CAC THAO TAC TREN CAY NHI PHAN TIM KIEM
#include<conio.h>
#include<stdio.h>
#include<alloc.h>
#include<cstdlib>
typedef struct node
{
int data;
struct node *left;
struct node *right;
};
typedef struct node *nhiphan;//có phải nhiphan là con trỏ kiểu node?
class tree
{
public:
nhiphan p;
void khoitao();
void themphantu(nhiphan *q,int x);
void nhap();
void duyet(nhiphan q);
} ;
//********ham khoi tao cay nhi phan tim kiem
void tree::khoitao()
{
p=NULL;
}
//*****ham them 1 phan tu vao cay nhi phan tim kiem
void tree::themphantu(nhiphan *q,int x)//tại sao chỗ này lại dùng *q ?
{
nhiphan t;
t=(nhiphan)malloc(sizeof(struct node));
t->data=x;
t->left=NULL;
t->right=NULL;
if(*q==NULL)
*q=t;
else
{
if((*q)->data>x) themphantu((&(*q)->left),x);
else
if((*q)->data<x) themphantu((&(*q)->right),x);
}
}

//******ham nhap cay
void tree::nhap()
{
int x;
printf("nhap cac phan tu cua cay, den khi het phan tu thi bam -0:
");
do
{
printf("
nhap x= ");scanf("%d",&x);
if(x!=-0)
{
themphantu(&p,x);
}
}while(x!=-0);
}
//*******ham duyet cay
void tree::duyet(nhiphan q)//chỗ này lại không dùng *q ?
{
if(q!=NULL)
{
duyet(q->left);
printf("%3d",q->data);
duyet(q->right);
}
}
//ham main
int main()
{
int n,xoa;
nhiphan t;
tree cay;
cay.khoitao();
cay.nhap();
printf("
cay vua nhap duoc duyet theo LNR la:
");
cay.duyet(cay.p);
getch();
}

các anh giải thích tỉ mỉ giùm em với, em còn gà lắm.