struct node *delete(struct node *root, int key)
{
struct node *remove_node;
if (root == NULL){
return root;
}
if ( key < root->key) {
root->left = delete(root->left, key);
} else if ( key > root->key) {
root->right = delete(root->right,key);
} else {
if ((root->left == NULL) && (root->right != NULL)){
remove_node = root->right;
*root = *remove_node;
deletetree(remove_node); // this is for free-ing the memory
} else if ((root->right == NULL) && (root->left != NULL)){
remove_node = root->left;
*root = *remove_node;
deletetree(remove_node);
} else if ((root->right == NULL) && (root->left == NULL)){
remove_node = root;
root = NULL;
} else {
remove_node = successor(root);
root->key = remove_node->key;
root->right = delete(root->right, remove_node->key);
}
}
if (root == NULL) {
return root;
if (balance_factor(root) == 2){
if (balance_factor(root->left) == -1) {
return single_right_rotation(root);
} else if (balance_factor(root->left) == 1) {
return double_left_rotation(root);
}
}
if (balance_factor(root) == -2) {
if (balance_factor(root->right) == -1) {
return single_left_rotation(root);
}
else if (balance_factor(root->right) == 1) {
return double_right_rotation(root);
}
}
}
return root;
}
这是我删除AVL树中元素的代码。一切似乎工作正常,它处理节点n没有孩子,一个孩子和两个孩子的所有情况。但由于一些奇怪的原因,它不能平衡树,也不会到达那段代码。
希望有人可以帮我调试代码,因为我无法找到“确切”错误的来源。
先谢谢
PS:后继函数只返回要删除的节点的右树上的最小元素,deletetree处理释放内存分配的东西。 此外,我100%表示我的旋转工作,因为它在我的插入功能中完美运行。
答案 0 :(得分:0)
您可以使用temp root作为参考,您可以这样更改:
struct node *localRoot = root;
你将root更改为localRoot,可能问题就解决了。 我希望它有用。