首页 文章

二进制搜索树删除不起作用,为什么?

提问于
浏览
0

我试图在C中实现二进制搜索树 . 但我陷入了删除操作,当我运行代码时它不会删除指定的值 .

在调用delete之前:(调用 inorder()

16 19 23

调用delete后:(调用 inorder()

16 19 23

码:

void deleteNode(struct node *n, int data)
{
     struct node *temp;
     if(n->data==data)
     {
       if(n->left == NULL && n->right == NULL)
       {
        n=NULL;
       }
       else if(n->left == NULL && n->right!=NULL)
       {
        n->data = (n->right)->data;
        n->right = NULL;
       }
       else if(n->left!=NULL && n->right == NULL)
       {
        n->data = (n->left)->data;
        n->left=NULL;
       }
       else if(n->left != NULL && n->right != NULL)
       {
        temp = findMax(root);
        n->data = temp->data;
        temp = NULL;
       }
     }
     else if(n->data > data)
     {
      deleteNode(n->left, data);
     }
     else if(n->data < data)
     {
      deleteNode(n->right, data);
     }
}

我有其他代码正在运行,但我想知道这段代码有什么问题?

Edit: 我已对代码进行了一些修改 .

现在,当我尝试删除 ROOT 节点时 . 我最终得到这个:( inorder遍历) - > 16 23 23

现在,当 temp = NULL 使最大节点为NULL时,为什么会发生这种情况 .

注意:我没有初始化temp,因为代码已被更改,并且它在使用之前被初始化( temp = findMax(root) ) .

code inorder():

void inorder(struct node *root)
{
    if(root!=NULL)
    {
         inorder(root->left);
         printf("%d\n", root->data);
         inorder(root->right);
    }
}

2 回答

  • 1

    使用此替代代码或在方法中使用临时树

    struct node *temp = n; //then use temp tree in code
    

    替代方法

    struct node *delete(struct node *tree, int data)
    {
        if(find(tree,data)==-1 || tree == NULL)
                return tree;
    
        if(tree->data == data)
            {   
                if(tree->left==NULL && tree->right==NULL)
                   return NULL; 
    
                if(tree->right != NULL){
                    tree->data = min(tree->right); 
                    tree->right = delete(tree->right,min(tree->right)); 
                    return tree;
                }
    
                    tree->data = madata(tree->left); 
                    tree->left = delete(tree->left,madata(tree->left)); 
                    return tree;
    
            }
    
        if(tree->data < data)
        {
            tree->right= delete(tree->right,data);
            return tree;
    
        }
    
        tree->left= delete(tree->left,data);
        return tree;
    }
    
  • 0

    这对我有用,

    struct node* deleteNode(struct node *n, int data)
    {
         struct node *temp;
         temp = n;
         if(n->data==data)
         {
           if(n->left == NULL && n->right == NULL)
           {
            n=NULL;
            return NULL;
           }
           else if(n->left == NULL && n->right!=NULL)
           {
            n = n->right;
            temp = NULL;
           }
           else if(n->left!=NULL && n->right == NULL)
           {
            n = n->left;
            temp = NULL;
           }
           else if(n->left != NULL && n->right != NULL)
           {
            temp = findMax(root);
            n->data = temp->data;
            temp = NULL;
           }
         }
         else if(n->data > data)
         {
          n->left = deleteNode(n->left, data);
         }
         else if(n->data < data)
         {
          n->right = deleteNode(n->right, data);
         }
         return n;
    }
    

相关问题