【发布时间】:2017-01-23 03:29:07
【问题描述】:
作为一个练习,我正在研究二叉搜索树。我已经设法搜索二叉树并添加节点,但现在我试图找到一种删除方法,我似乎陷入了如何确定谁是节点的父节点将被删除。
所以首先我有这个结构
struct BST_node {
struct double_linked_list *data;
struct BST_node *left;
struct BST_node *right;
};
我还有一个指向根的结构的指针..
struct BST_node *BST_email_root = 0;
我有这个功能来搜索节点
struct BST_node *BST_find_customer(struct BST_node *root, char *email) {
if (root==NULL)
return NULL;
if (strcmp(email,root->data->data->email)==0)
return root;
else
{
if (strcmp(email,root->data->data->email)==-1)
return BST_find_customer(root->left,email);
else
return BST_find_customer(root->right,email);
}
我在其他函数中调用,通过使用
b = BST_find_customer(BST_email_root, email);
我正在尝试创建删除节点的功能..我要做的是:
struct BST_node *BST_delete(struct BST_node *root, char *email)
{
struct BST_node *temp;
if (root==NULL)
return root;
else if(strcmp(root->data->data->email,email)>0)
root->left = BST_delete(root->left, email);
else if(strcmp(root->data->data->email,email)<0)
root->right = BST_delete(root->right, email);
else
{
if(root->left == NULL && root->right == NULL)
{
free(root);
root = NULL;
}
else if(root->right == NULL)
{
temp = root;
root = root->left;
free(temp);
}
else if(root->left == NULL)
{
temp = root;
root = root->right;
free(temp);
}
else
{
struct BST_node *maxNode = findMaxNode(root->left);//finding the maximum in LEFT sub-tree
root->data = maxNode->data; //Overwriting the root node with MAX-LEFT
root->left = BST_delete(root->left, maxNode->data);//deleted the MAX-LEFT node
}
return root;
}
}
也可以使用这个函数
struct BST_node *findMaxNode(struct BST_node *root)
{
if(root->right == NULL) return root;
findMaxNode(root->right);
}
但是这也不起作用,我得到错误
【问题讨论】:
-
尝试保留一个指向您已遍历的上一个节点的指针。
标签: c binary-search-tree