结点声明
typedef struct node
{
KeyType key; //关键字项
InfoType data; //其它数据项
struct node*lchild,*rchild; //左右孩子指针
}BSTNode;
二叉排序树的插入和创建
bool InsertBst(BSTNode *&bt,KeyType k)
//在二叉排序树bt中插入关键字为k的结点
{
if(bt==NULL) //原树为空
{
bt=(BSTNode *)malloc(sizeof(BSTNode));
bt->key=k;bt->lchuld=bt->rchild=NULL;
return true;
}
else if(k==bt->key) //存在相同
return false;
else if(k<bt->key)
return Insert(bt->lchild,k);
else
return Insert(bt->rchild,k);
}
BstNode *CreateBST(KeyType a[],int n)
//返回BST树根节点指针
{
BSTNode *bt=NULL; //初始bt为空树
int i=0;
while(i<n)
{
InsertBST(bt,a[i]);
i++;
}
return bt;
}
二叉排序树的查找
BSTNode *SearchBST(BSTNode *bt,KeyType k)
{
if(bt==NULL || bt->key==k)
return bt;
if(k<bt->key)
return SearchBST(bt->lchild,k); //在左子树中递归查找
else
return SearchBST(bt->rchild,k); //右
}
BSTNode *SearchBST1(BSTNode *bt,KeyType k,BSTNode *f1,BSTNode *&f)
//查找k的结点,成功返回结点指针,f返回双亲结点SearchBST1(bt,x,NULL,f)
{
if(bt==NULL)
{
f=NULL;
return(NULL);
}
else if(k==bt->key)
{
f=f1;
return(bt);
}
else if(k<bt->key)
return SearchBST1(bt->lchild,k,bt,f);
else
return SearchBST1(bt->rchild,k,bt,f);
}
二叉排序树删除
//删除只有右子树的结点p
bool deletek(BSTNode *&BT,KeyType k)
{
if(bt!=NULL)
{
if(k==bt->key) //找到了被删除结点k
{
deletep(bt)
return ture;
}
else if(k<bt->key)
{
deletek(bt->lchild,k)
}
else
{
deletek(bt->rchild,k)
}
else return false;
}
void deletep(BSTNode *&p)
{
BSTNode *q;
q=p;
p=p->rchild;
free(q);
}
bool DeleteBST(BSTNode *&bt,KeyType k)
{
if(bt==NULL)
return false;
else
{
if(k<bt->key)
return DeleteBST(bt->lchild,k);
else if(k>bt->key)
return DeleteBST(bt->rchild,k);
else
{
Delete(bt);
return true;
}
}
}
void Delete(BSTNode *&p) //从二叉排序树中删除结点p
{
BSTNode *q;
if(p->rchild==NULL) //结点p没有右子树
{
q=p;
p=p->lchild;
free(q);
}
else if(p->lchild==NULL) //结点p没有左子树
{
q=p;
p=p->rchild;
free(q);
}
else Deletel(p,p->lchild); //结点p既有左子树又有右子树
void Deletel(BSTNode *p,BSTNode *&r)
{
BSTNode *q;
if(r->rchild!=NULL)
Deletel(p,r->rchild);
else //找到了最右下结点
{
p->key=r->key; //将结点r的值存放到结点p中
p->data=r->data;
q=r; //删除结点r
r=r->lchild; //即用结点r的左孩子替代他
free(q); //释放结点q的空间
}
}