用语言描述过程如下:
申请新结点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是不是就是同一个结点了?
问题有点多,求解答