将元素b添加到二叉树T中作为结点p的左孩或右孩

用语言描述过程如下:
申请新结点x,x->Data=b; x->Lchild=0; x->Rchild=0
如果T==0,则T = x;
如果p!=0且是添加左孩,则p->Lchild = x;
如果p==0,则从p=T开始,寻找p->Lchild==0的结点p,令 p->Lchild = x;
如果p!=0且是添加右孩,则p->Rchild = x;
如果p==0,则从p=T开始,寻找p->Rchild ==0的结点p,令 p->Rchild = x;
**疑问:为什么要分析p是否等于零?p==0的话,按照上述说法,从p=T开始,寻找p->Lchild==0的结点p,是不是添加的就是整个树的左孩?
**
代码如下:

void Setuptree(struct Treenode **T, int b,  struct Treenode *p, int tag )
{    struct Treenode *x;
    x=(struct Treenode *) malloc(sizeof(struct Treenode));
    x->Data = b; x->Lchild = 0;  x->Rchild = 0;
    if ((*T)==0) (*T)=x;
    else if (p != 0)
       {  if (tag==0) { x->Lchild = p->Lchild;  p->Lchild = x; } 
          else { x->Rchild = p->Rchild; p->Rchild = x;  }
       }
    else  if (tag==0)
    {  p = (*T);
       while (p->Lchild !=0) p=p->Lchild;
       p->Lchild = x;
    }
    else  { p = (*T); 
                  while (p->Rchild !=0) p=p->Rchild;
               p->Rchild = x;
                }
}

疑问:tag是用来做什么的?x->Lchild = p->Lchild; 这句的意思是不是将p的左孩作为x的左孩?那为什么又有 p->Lchild = x;?而且x->Lchild = p->Lchild这样的话p和x是不是就是同一个结点了?

问题有点多,求解答

看你说的没看明白,不过代码我看明白了。