繁体   English   中英

在C中的二叉搜索树中删除

[英]Deletion in binary search tree in C

我的链表结构是

typedef struct ll
{
 int data;
 struct ll *left;
 struct ll *right;
}node;  

我的删除功能是

void delete(node **parent,node **root,int n)
{
 if((*root)==NULL) //if tree is empty then return
 {
  printf("No tree\n");
  return;
 }
 else
 {
   if(((*root)->data)==n)
  {
   free(*root);
   return;  // if head is the node to be deleted
  }
  else if(((*root)->data)<n)
  {
   (*parent)=(*root);
   (*root)=(*root)->right;
  }
  else(((*root)->data)>n);
  {
   (*parent)=(*root);
   (*root)=(*root)->left;
  }
   while((*root)!=NULL)
   {
    if(((*root)->data)==n)
    {      
     break;
    }
    (*parent)=(*root);
    if(((*root)->data)>n)
    (*root)=(*root)->left;
    else
    (*root)=(*root)->right;
   }
 }
 if(((*root)->left)==NULL && ((*root)->left)==NULL) //both children are NULL
 {
  del_a(parent,root);
 }
 else if(((*root)->left)==NULL && ((*root)->left)!=NULL)// only one child is NULL
 {
  del_b(parent,root);
 }
 else if(((*root)->left)!=NULL && ((*root)->left)==NULL)// only one child is NULL
 {
  del_b(parent,root);
 }
 else
 {
 del_c(parent,root); //No child is NULL
 }
}

del_a(node **parent,node **root)
{
 if((*parent)->left==(*root))
 {
  free(*root);
  (*parent)->left=NULL;
 }
 else
 {
  free(*root);
  (*parent)->right=NULL;
 }
}

del_b(node **parent,node **root)
{
 if(((*parent)->left)==(*root))
 {
  if(((*root)->left)==NULL)
  {
   (*parent)->left=(*root)->right;
   free(*root);
  }
  else
  {
   (*parent)->left=(*root)->left;
   free(*root);
  }
 }
 else
 {
  if(((*root)->left)==NULL)
  {
   (*parent)->right=(*root)->right;
   free(*root);
  }
  else
  {
   (*parent)->right=(*root)->left;
   free(*root);
  }  
 }
}

del_c(node **parent,node **root)
{
 node *temp=(*root)->right;
 node *prt=(*root);
 while((temp->left)!=NULL)
 {
  prt=temp;
  temp=temp->left;
 }

  (*root)->data=temp->data;

 if((temp->right)==NULL)
 {
  del_a(&prt,&temp);
 }
 else
 {
  del_b(&prt,&temp);
 }

}

我正在传递参数(其中head是第一个节点)

delete(NULL,&head,n); 

该程序将删除数字n ,但随后立即崩溃。 问题是什么?

当地址为NULL时,您正在使用parent 你也必须得到分段错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM