删除二叉搜索树中的节点会引发错误
Posted
技术标签:
【中文标题】删除二叉搜索树中的节点会引发错误【英文标题】:Deletion of node in Binary Search Tree is throwing error 【发布时间】:2019-02-09 20:24:46 【问题描述】:专家,这是我在二叉搜索树中创建和删除节点的代码。它可以正常插入,但在尝试删除节点时(调用 deleteNode() 函数)会引发分段错误(核心转储)。我不明白实际上是什么问题。 请帮忙!提前谢谢!
#include <stdio.h>
#include <stdlib.h>
int size = 0;
typedef struct mylist
int data;
struct mylist *left;
struct mylist *right;
node;
node *root;
void create_root(node *root)
root = NULL;
//Inserting nodes
node* insert(node *root, int val)
node *ptr, *parentptr, *nodeptr;
ptr = (node*)malloc(sizeof(node));
ptr -> data = val;
ptr -> left = NULL;
ptr -> right = NULL;
if(root == NULL)
root = ptr;
else
parentptr = NULL;
nodeptr = root;
while(nodeptr != NULL)
parentptr=nodeptr;
if(val < nodeptr -> data)
nodeptr = nodeptr -> left;
else
nodeptr = nodeptr -> right;
if(val < parentptr -> data)
parentptr -> left = ptr;
else
parentptr -> right = ptr;
return root;
node* minValueNode(node* root)
node* cur = root;
while (cur->left != NULL)
cur = cur->left;
return cur;
node* deleteNode(node* root, int key)
if (root == NULL)
printf("\nValue not found\n");
if (key < root-> data)
root->left = deleteNode(root->left, key);
else if (key > root-> data)
root->right = deleteNode(root->right, key);
else
if (root->left == NULL)
node *temp = root->right;
free(root);
return temp;
else if (root->right == NULL)
node *temp = root->left;
free(root);
return temp;
node* temp = minValueNode(root->right); //Inorder successor
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
return root;
void main()
int option, val;
node *ptr;
int flag = 1;
create_root(root);
while(flag != 2)
printf("\nChoose-\n1-Insert\n2-Delete\n3-Exit\n");
scanf("%d", &option);
switch(option)
case 1:
printf("\nEnter the value of new node\n");
size++;
scanf("%d", &val);
root = insert(root, val);
break;
case 2:
int k;
printf("Enter the value to delete");
scanf("%d",&k);
root=deleteNode(root, k);
size--;
break;
case 3:
flag=2;
break;
default:
printf("\nWrong entry\n");
【问题讨论】:
您在这一行if (key < root-> data)
有一个空指针的尊重,您的代码的实时测试可在此处获得:segfault.stensal.com/a/UUqrJZSlUx9LBLBW
【参考方案1】:
您必须在deleteNode()
中的第一个if()
中返回NULL
,或者您必须在第二个if()
之前放置一个else
node* deleteNode(node* root, int key)
if (root == NULL)
printf("\nValue not found\n");
return NULL; // <== This was missing.
...
或者(也许是有意的?):
node* deleteNode(node* root, int key)
if (root == NULL)
printf("\nValue not found\n");
else if(key < root->data)
...
目前,即使root
为空,这也会导致下一个if(key < root->data)
,这会导致段错误。
另外:如果可以使用 C++11,请使用 nullptr
。
【讨论】:
以上是关于删除二叉搜索树中的节点会引发错误的主要内容,如果未能解决你的问题,请参考以下文章
leetcode中等450删除二叉搜索树中的节点 / 701二叉搜索树中的插入操作
LeetCode 二叉树专项删除二叉搜索树中的节点(450)
[JavaScript 刷题] 树 - 删除二叉搜索树中的节点, leetcode 450