2017-02-02 52 views
0

我试图在C中实现二进制搜索树。 但是我坚持删除操作,当我运行代码时它不删除指定的值。二元搜索树删除不起作用,为什么?

之前调用删除:(主叫inorder()

16 19 23 

调用删除后:(主叫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节点。 我结束了这一点: (序遍历) - >16 23 23

现在, 为什么会出现这种情况时temp = NULL正在最大节点NULL。

注意:由于代码已更改并且在使用之前初始化(temp = findMax(root)),所以我没有初始化temp。

码序():

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

在上面的代码中,你甚至不会初始化'temp'。 –

+2

'n = NULL;':这不起作用。 '免费(临时);':'临时'是未经过创新的。 – BLUEPIXY

+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

我的主要问题是我的代码有什么问题,你能简单解释一下吗? – hrishikesh

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; 
}