gpt4 book ai didi

c - 二叉搜索树删除不起作用,为什么?

转载 作者:行者123 更新时间:2023-11-30 15:00:38 25 4
gpt4 key购买 nike

我正在尝试用 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节点时。我最终得到这个:(中序遍历)-> 16 23 23

现在,为什么当 temp = NULL 使最大节点为 NULL 时会发生这种情况。

注意:我没有初始化 temp,因为代码已更改,并且在使用之前对其进行了初始化 (temp = findMax(root))。

代码 inorder():

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

最佳答案

使用此替代代码或在方法中使用临时树

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

关于c - 二叉搜索树删除不起作用,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41997353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com