2016-03-30 7 views
1

Dies ist der Code zum Einfügen und Löschen in BST. Ein Problem beim Löschen des Knotens, der sowohl untergeordnete als auch einen Laufzeitfehler aufweist. Alle anderen Funktionen funktionieren ordnungsgemäß. Ich denke, in der Funktion delete_node ist etwas schief gegangen. Welche Änderungen sollte ich vornehmen, damit der Knoten ordnungsgemäß gelöscht werden kann?Laufzeitfehler beim Löschen eines Knotens in BST

#include<stdio.h> 
#include<iostream> 
#include<stdlib.h> 
struct node* parent(struct node* root, int target); 
using namespace std; 

struct node{ 
int data; 
struct node* left; 
struct node* right; 
}; 
struct node* head=NULL; 
struct node* newnode(int value) 
{ 
struct node* newnode=(struct node*)malloc(sizeof(struct node)); 
newnode->data=value; 
newnode->left=NULL; 
newnode->right=NULL; 
return newnode; 
} 

void insert(struct node* root,int data) 
{ 
    struct node* temp=newnode(data); 

if(head==NULL) 
{ 
    head=temp; 
} 
else if(root->data >= temp->data) 
{ 
    if(root->left != NULL) 
    { 
     insert(root->left,temp->data); 
    } 
    else//if(root->left==NULL) 
    { 
     root->left=temp; 
    } 
} 
else 
{ 
    if(root->data < temp->data) 
    { 
     if(root->right!=NULL) 
     { 
      insert(root->right,temp->data); 
     } 
     else 
     { 
      root->right=temp; 
     } 
    } 
    } 
} 
void delete_node(struct node* root,int data) 
{ 
struct node* y=NULL; 
struct node* adjust=NULL; 
struct node* temp=NULL; 

if(search_rec(root,data)) 
{ 
    temp=search_rec(root,data); 
} 

if(temp->left == NULL && temp->right == NULL) 
{ 
    y=parent(root,data); 
    if(y->data < data) 
     y->right=NULL; 
    else 
     y->left=NULL; 
} 
else if(temp->left == NULL) 
{ 
    y=parent(root,data); 
    if(y->data < data) 
     y->right=temp->right; 
    else 
     y->left=temp->right; 
    delete(temp); 
} 
else if(temp->right == NULL) 
{ 
    y=parent(root,data); 
    if(y->data < data) 
     y->right=temp->left; 
    else 
     y->left=temp->left; 
    delete(temp); 
} 
else//(it has both left and right child) 
{ 
    adjust=min(temp->right); 
// cout<<adjust->data; 
    temp->data=adjust->data; 
    delete_node(temp->right,adjust->data); 
} 
} 

struct node* min(struct node* temp) 
{ 
if(head==NULL) 
{ 
    cout<<"Tree is empty"; 
} 
else 
{ 
    while(temp->left!=NULL) 
    { 
     temp=temp->left; 
    } 
    //cout<<"Key is="<<temp->data; 
    return temp; 
} 
} 
struct node* parent(struct node* root, int target) 
{ 
if(head == NULL || head->data == target) 
    return NULL; 
if(root->left) 
{ 
    if(root->left->data == target) 
    { 
     //cout<<root->data; 
     return root; 
    } 
} 
if(root->right) 
{ 
    if(root->right->data == target) 
    { 
     //cout<<root->data; 
     return root; 
    } 
} 
if (root->data < target) 
{ 
    parent(root->right,target); 
} 
else // (root->data >= target) 
{ 
    parent(root->left,target); 
} 
} 

int main() 
{ 
int choice,number,subchoice; 
struct node* add=NULL; 
insert(head,2); 
insert(head,4); 
insert(head,5); 
insert(head,6); 
insert(head,65); 
insert(head,24); 
insert(head,56); 
insert(head,78); 
insert(head,100); 
insert(head,1); 
insert(head,0); 
insert(head,57); 
delete_node(head,65); 
} 

Antwort

0

In diesen Zeilen:

if(temp->left == NULL && temp->right == NULL){ 
    y=parent(root,data); 

Ich glaube, Sie lieber die Eltern von Temp wollen:

y=parent(root,data); 
+0

Ja, würde es die Eltern von Temp (Daten) geben .Aber Ich denke, Problem ist in der else Teil der delete_node.As ich den Knoten mit beiden rechten und linken Kind löschen möchte, zeigt es Laufzeitfehler.Bitte überprüfen Sie dieses Snippet. else // (es hat links und rechts Kind) { adjust = min (temp-> right); // cout < Daten; temp-> Daten = anpassen-> Daten; delete_node (temp-> right, adjust-> data); } –