2016-03-30 26 views
1

BST'de Ekleme ve Silme kodu budur. Her iki çocuğa sahip olan düğümü silerek bir problem ortaya çıkar ve çalışma zamanı hatası verir. Diğerleri İşlevler düzgün çalışıyor. Delete_node işlevinde bir şeyler ters gittiğini düşünüyorum. Düğümü düzgün şekilde silebilmek için ne gibi değişiklikler yapmalıyım? Bu dizelerdeBST'de bir düğümü silerken çalışma zamanı hatası

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

cevap

0

:

y=parent(root,data); 
+0

Evet, geçici (veri) üst öğesini verecekti .ama:

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

Sana ziyade temp ebeveyn istemek sanırım Problemin delete_node'un bir parçası olduğunu düşünüyorum. Hem sağ hem de sol çocuğa sahip olan düğümü silmek istiyorum, bu, çalışma zamanı hatasını gösterir. Lütfen bu parçacığı kontrol edin. else // (hem sol hem de sağ çocuğu vardır) { ayarlamak = dk (temp-> right); // cout < verileri; temp-> data = adjust-> data; delete_node (temp-> right, adjust-> data); } –

İlgili konular