二叉搜索树

初始化

void SearchTreeInit(SearchNode** pRoot){
  if(pRoot == NULL){
     return;
  }
  *pRoot = NULL;
  return;
}

销毁

void DestroySearchNode(SearchNode* node){
  free(node);
}

void SearchTreeDestroy(SearchNode** pRoot){
  if(pRoot == NULL){
    return;
  }
  if(*pRoot == NULL){
    return;
  }
  SearchNode* root = *pRoot;
  SearchTreeDestroy(&root->lchild);
  SearchTreeDestroy(&root->rchild);
  DestroySearchNode(root);
  *pRoot = NULL;
  return;
}

插入

void SearchTreeInsert(SearchNode** pRoot,SearchNodeType to_insert){
  if(pRoot == NULL){
    return;
  }
  if(*pRoot == NULL){
   SearchNode* new_node = CreateSearchNode(to_insert);
   *pRoot = new_node;
   return;
  }
  SearchNode* cur = *pRoot;
  if(to_insert < cur->data){
    SearchTreeInsert(&cur->lchild, to_insert);
  }else if(to_insert > cur->data){
     SearchTreeInsert(&cur->rchild,to_insert);
   }else{
      return;
    }
  return;
}

找节点

SearchNode* SearchTreeFind(SearchNode* root,SearchNodeType to_find){
  if(root == NULL){
    return NULL;
  }
  if(to_find < root->data){
    return SearchTreeFind(root->lchild, to_find);
  }
  else if(to_find > root->data){
    return SearchTreeFind(root->rchild,to_find);
  }else{
     return root;
   }
}

删除(思路):

1.找到to_remove所在的位置

2.如果没找到,就直接返回

3.如果找到了,分情况讨论

  a.要删除的节点没有子树

  b.要删除的节点只有左子树

  c.要删除的节点只有右子树

  d.要删除的节点有左右子树

void SearchTreeRemove(SearchNode** pRoot, SearchNodeType to_remove){
  if(pRoot == NULL){
    return;
  }
  if(*pRoot == NULL){
   //2.
    return;
  }
//1.
  SearchNode* root = *pRoot;
  if(to_remove < root->data){
    SearchTreeRemove(&root->lchild,to_remove);
    return;
  }else if(to_remove > root->data){
    SearchTreeRemove(&root->rchild,to_remove);
    return;
   }else{
SearchNode* to_remove_node = root;
//3.
     if(root->lchild == NULL && root->rchild == NULL){
      //a.
       *pRoot = NULL;
        DestroySearchNode(root);
        return;
     }else if(root->lchild != NULL && root->rchild == NULL){
       //b. 
       *pRoot = to_remove_node->lchild;
       DestroySearchNode(to_remove_node);
       return;
     }else if(root->lchild == NULL && root->rchild != NULL){
       //c
 *pRoot = to_remove_node->rchild;
       DestroySearchNode(to_remove_node);
       return;
     }else{
        //d.
       SearchNode* min = to_remove_node->rchild;
       while(min->lchild != NULL){
         min = min->lchild;
       }
       to_remove_node->data = min->data;
       SearchTreeRemove(&to_remove_node->rchild, min->data);
       return;
     }
   }
  return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值