二叉排序树

struct BinSearchNode;
typedef struct BinSearchNode *PBinSearchNode;
struct BinSearchNode{
  keyType key;
  PBinSearchNode llink,rlink;
};
typedef struct BinSearchNode *BinSearchTree;
typedef BinSearchTree *PBinSearchTree;

int search(PBinSearchTree ptree, KeyType key,PBinSearchNode *position)
{
  PBinSearchNode p,q;
  p = *ptree;
  q = p;
  while(p!=NULL) {
    q = p;
    if(p->key == key) { 
      *position = p;
      return 1; 
    }
    else if(p->key > key)
      p=p->llink;
    else p = p->rlink;
  }
  *position = q;
  return 0;
}

int insert(PBinSearchTree ptree, KeyType key){
  PBinSearchNode p,position;
  if(Search(ptree, key,&position) == 1) 
    return 1;
  p = (PBinSearchNode)malloc(sizeof(struct BinSearchNode));
  if(p==NULL) 
  {
    printf("Error!\n"); 
    return 0;
  }
  p->key = key; p->llink = p->rlink = NULL;
  if(position == NULL) *ptree = p;
  else if(key<position->key) position->llink = p;
  else position->rlink = p;
  return 1;
}

int createSearchTree(PBinSearchTree ptree, SeqDictionary *dic)
{
  int i;
  *ptree = NULL;
  for(i=0; i<dic->n;i++)
    if(!insert(ptree, dic->element[i].key)) return 0;
  return 1;
}

int delete(PBinSearchTree ptree, KeyType key){
  PBinSearchNode parentp, p ,r;
  p = *ptree;
  parentp = NULL;
  while(p!=NULL) {
    if(p->key == key) break;
    parentp = p;
    if(p->key > key) p=p->llink;
    else p=p->rlink;
  }
  if(p==NULL) return 0;
  if(p->llink == NULL){
  if(parentp == NULL)
    *ptree = p->rlink;
  else if(parentp->llink == p)
    parentp->llink = p->rlink;
  else 
    parentp->rlink = p->rlink;
  }
  else {
    r = p->llink;
    while(r->rlink!=NULL) r = r->rlink;
    r->rlink = p->rlink;
    if(parentp == NULL) *ptree = p->llink;
    else if(parentp->llink == p)
      parentp->llink = p->llink;
    else 
      parentp->rlink = p->llink;
  }
  free p;
  return 1;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值