记录失败的二叉搜索树的操作集代码

记录失败的二叉搜索树的操作集代码。呜呜做了挺久的,感觉没啥问题但一个测试点都没过,全是段错误,我服了呜呜。

BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );

BinTree Insert( BinTree BST, ElementType X )
{
    BinTree pre=NULL;
    BinTree work=BST;
    
    if(BST==NULL)
    {
        BST->Data=X;
        return BST;
    }
    while(work!=NULL)
    {
        if(X>work->Data)
        {
            pre=work;
            work=work->Right;
        }
        else if(X<work->Data)
        {
            pre=work;
            work=work->Left;
        }
        else
        {
            return;
        }
    
    }
    if(X>pre->Data)
    {
       // BinTree node=(BinTree)malloc(sizeof(struct TNode));
       // node->Data=X;
        pre->Right=(BinTree)malloc(sizeof(struct TNode));
        pre->Right->Right=NULL;
        pre->Right->Left=NULL;
       // node->Right=NULL;
        //node->Left=NULL;
        return BST;
    }
    if(X<pre->Data)
    {
      //  BinTree node=(BinTree)malloc(sizeof(struct TNode));
       // node->Data=X;
        pre->Left=(BinTree)malloc(sizeof(struct TNode));
        pre->Left->Right=NULL;
        pre->Left->Left=NULL;
       // node->Right=NULL;
        //node->Left=NULL;
        return BST;
    }
}

BinTree Delete( BinTree BST, ElementType X )
{
    BinTree ghost;
    BinTree ghostpar;
    
    ghost=BST;
    
    while(ghost!=NULL)
    {
        if(X==BST->Data&&BST->Left==NULL&&BST->Right==NULL)//根节点为叶子节点
            {
                BST=NULL;
            }
        
        if(X<ghost->Data)//小于就进左数
        {
            ghostpar=ghost;
            ghost=ghost->Left;
            if(ghost->Data==X)
            {
            
            if(ghost->Left==NULL&&ghost->Right==NULL)//被删除节点是叶子节点
            {
                ghost=NULL;
            }
             if(ghost->Right==NULL&&ghost->Left!=NULL)//被删除节点有左孩子无右孩子
             {
                 ghostpar->Left=ghost->Left;
                 ghost=NULL;
             }
             if(ghost->Left==NULL&&ghost->Right!=NULL)//被删除节点有右孩子无左孩子
             {
                 ghostpar->Left=ghost->Right;
                 ghost=NULL;
             }
                
                
            }
        }
        if(X>ghost->Data)//大于就进右树
        {
            ghostpar=ghost;
            ghost=ghost->Right;
              if(ghost->Data==X)
            {
            
            if(ghost->Left==NULL&ghost->Right==NULL)//被删除为叶子节点
            {
                ghost=NULL;
            }
                    if(ghost->Right==NULL&&ghost->Left!=NULL)//被删除节点有左孩子无右孩子
             {
                 ghostpar->Right=ghost->Left;
                 ghost=NULL;
             }
             if(ghost->Left==NULL&&ghost->Right!=NULL)//被删除节点有右孩子无左孩子
             {
                 ghostpar->Right=ghost->Right;
                 ghost=NULL;
             }
                
            }
        }
        
        
    }
    //被删除节点有左右孩子
    
       ghost=BST;
            BinTree node;
               BinTree par;
       while(ghost!=NULL)
       {
           if(BST->Data==X&&BST->Left!=NULL&&BST->Right!=NULL)
           {
               while(ghost!=NULL)//找到左树的最大节点
               {
                   
                       ghostpar=ghost;
                       ghost=ghost->Right;
                   
               }
               if(ghost->Left!=NULL)//左数最大节点有左节点
               {
                   ghostpar->Right=ghost->Left;
               }
               BST->Data=ghost->Data;//交换节点值并重连节点
               ghost->Left=BST->Left;
               ghost->Right=BST->Right;
           }
           else
           {
              
               if(X>ghost->Data)
               {
                   ghostpar=ghost;
                   ghost=ghost->Right;
                    if(X==ghost->Data)
               {
                   node=ghost;
                   par=ghostpar;
                   
                while(ghost!=NULL)//找到左树的最大节点
               {
                   
                       ghostpar=ghost;
                       ghost=ghost->Right;
                   
               }
                   if(ghost->Left!=NULL)
                   {
                       ghostpar->Right=ghost->Left;
                   }
                   
                   par->Right=ghost;
                   ghost->Left=node->Left;
                   ghost->Right=node->Right;
                   
               }
               }
               if(X<ghost->Data)
               {
                   ghostpar=ghost;
                   ghost=ghost->Left;
                    if(X==ghost->Data)
               {
                   node=ghost;
                   par=ghostpar;
                   
                while(ghost->Right!=NULL)//找到左树的最大节点
               {
                   
                       ghostpar=ghost;
                       ghost=ghost->Right;
                   
               }
                   if(ghost->Left!=NULL)
                   {
                       ghostpar->Right=ghost->Left;
                   }
                   
                   par->Left=ghost;
                   ghost->Left=node->Left;
                   ghost->Right=node->Right;
                   
               }
               }
              
              
           }
           
           
       }
   
    
}

Position Find( BinTree BST, ElementType X )
{
    BinTree ghost=BST;
    BinTree ghostpar;
    
    if(BST->Data==X)
    {
        return BST;
    }
    else
    {
          while(ghost!=NULL)
    {
        if(X>ghost->Data)
        {
            ghostpar=ghost;
            ghost=ghost->Right;
           if(ghost->Data==X)
           {
               return ghost;
           }
        }
        if(X<ghost->Data)
        {
            ghostpar=ghost;
            ghost=ghost->Left;
           if(ghost->Data==X)
           {
               return ghost;
           }
        }
    }
    }
  
    return NULL;
}

Position FindMin( BinTree BST )
{
    if(BST==NULL||BST->Left==NULL)
    {
        return BST;
    }
    else
    {
          BinTree min;
    min=BST;
    while(min->Left!=NULL)
    {
        min=min->Left;
    }
    
    return min;
    }
  
}
Position FindMax( BinTree BST )
{
    if(BST==NULL||BST->Right==NULL)
    {
        return BST;
    }
    else
    {
        BinTree max;
    
    max=BST;
    while(max->Right!=NULL)
    {
        max=max->Right;
    }
    
    return max;
    }
    
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值