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

时间:2017-02-02 08:26:17

标签: c data-structures binary-search-tree

我正在尝试在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);
     }
}

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

修改 我已经编辑了代码,但有一些变化。

现在,当我尝试删除 ROOT 节点时。 我最终得到了这个: (inorder遍历) - &gt; 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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
}