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);
}
Evet, geçici (veri) üst öğesini verecekti .ama:
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); } –