二叉搜索树

博客主要围绕二叉搜索树展开,介绍了其插入、查找和删除操作。这些操作是二叉搜索树的基本功能,在信息技术领域的数据结构处理中具有重要作用。

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

BinarySearchTree

**Insert 插入

template<class T>
void InsertNode(BinaryTreeNode<T> *root , BinaryTreeNode<T> *newpointer)  {                    
          BinaryTreeNode<T> *pointer = NULL;
          if (root == NULL) {                 //如果是空树
             Initialize(newpointer);   //则用指针newpointer作为树根
             return;
          }
   else pointer = root;
   while (pointer != NULL) {
       if (newpointer->value() == pointer->value())// 如果存在相等的元素则不用插入
          return ;
       else if (newpointer->value() < pointer->value()) { // 如果待插入结点小于pointer的关键码值
      if (pointer->leftchild() == NULL) {   // 如果pointer没有左孩子
         pointer->left = newpointer;  // newpointer作为pointer的左子树
                return;
      }
      else      pointer = pointer->leftchild();    // 向左下降
       }
       else { // 若待插入结点大于pointer的关键码值
       if (pointer->rightchild() == NULL){//如果pointer没有右孩子
         pointer->right = newpointer;                     // newpointer作为pointer的右子树
         return;
        }
        else    pointer = pointer->rightchild();         // 向右下降
       }
    }
}

Find 查找

template <class T>
BinarySearchTreeNode<T>* search(BinarySearchTreeNode<T>* root,T key){
 BinarySearchTreeNode<T>* current=root;
 while((NULL!=root)&&(key!=current->getValue()))//当前结点的key值等于查询的值时,退出循环
 {
  current=(key<current->getValue() ? search(current->leftChild,key) : search(current->rightChild,key));//根据当前结点的值的大小决定移动方向 
  } 
  return current;
}

Delete 删除

//方法一:合并删除
template <class T>
void deleteByMerging(BinarySearchTreeNode<T>* node){
 BinarySearchTreeNode<T> *tmp=node;
 if(node!=NULL){                       
        if(!node->rightChild)               //如果被删除结点没有右子树,用其左子树的根结点来代替被删除结点
         node=node->leftChild;                
 else if(node->leftChild==NULL)       //如果被删除结点没有左子树,用其右子树的根结点来代替被删除结点
         node=node->rightChild;
 else{                      //如果被删除结点左右子树都存在 
  tmp=node->leftChild;
  while(tmp->rightChild!=NULL)    //查找左子树中按中序遍历的最后一个节点
                    tmp=tmp->rightChild;            
           tmp->rightChild=node->rightChild;    //将查找到的结点的右指针赋值为被删除结点的右子树的根
  tmp=node;
         node=node->leftChild; //用左子树的根结点代替被删除结点 
     } 
 delete tmp;
 }
}
//方法二:复制删除
template <class T>
void deleteByCopying(BinarySearchTreeNode<T>* node){
 BinarySearchTreeNode<T>* previous,*tmp=node;
 if(node->rightChild==NULL)       //如果被删除结点没有右子树,用其左子树的根结点来代替被删除结点
     node=node->leftChild;               
 else if(node->leftChild==NULL)   //如果被删除结点没有左子树,用其右子树的根结点来代替被删除结点
     node=node->rightChild;
 else{
    tmp=node->leftChild;
    previous=node;
    while(tmp->rightChild!=NULL) //查找左子树中关键码最大的结点
    {
     previous=tmp;
     tmp=tmp->rightChild;
    } 
    node->value=tmp->value;    //将查找到的结点的值赋值给被删除结点
    if(previous==node)
        previous->leftChild=tmp->leftChild;
    else
        previous->rightChild=tmp->leftChild; 
 } 
 delete tmp;
}6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值