{
bitree p,s; status flag;
searchbst1(t,e.key,null,p,flag); if(!flag) /* 查找不成功 */ {
s=(bitree)malloc(sizeof(bitnode)); s-data=e;
s-lchild=s-rchild=null; if(!p)
*t=s; /* 被插结点*s为新的根结点 */ else if lt(e.key,p-data.key)
p-lchild=s; /* 被插结点*s为左孩子 */ else
p-rchild=s; /* 被插结点*s为右孩子 */ return true; }
else
return false; /* 树中已有关键字相同的结点,无需插入 */ }
/* 从二叉排序树中删除结点p,并重接它的左或右子树。*/ void delete(bitree *p) {
bitree q,s;
if(!(*p)-rchild) /* 右子树空则只需重接它的左子树 */{ q=*p;
*p=(*p)-lchild; free(q); }
else if(!(*p)-lchild) /* 只需重接它的右子树 */ {
q=*p;
*p=(*p)-rchild; free(q); }
else /* 左右子树均不空 */ {
q=*p;
s=(*p)-lchild;
while(s-rchild) /* 转左*/
{
q=s;
s=s-rchild;