二叉排序树-BST

该文详细介绍了二叉排序树的基本操作,包括如何在树中插入新节点、查找特定关键字的节点以及删除特定节点的方法。提供了插入函数InsertBST、创建函数CreateBST、两种查找函数SearchBST和SearchBST1,以及删除函数DeleteBST和Delete,涵盖了不同情况下的处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结点声明

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的空间
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值