删除C中AVL树中的元素

时间:2012-06-11 23:16:58

标签: c avl-tree

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%表示我的旋转工作,因为它在我的插入功能中完美运行。

1 个答案:

答案 0 :(得分:0)

您可以使用temp root作为参考,您可以这样更改:

struct node *localRoot = root;

你将root更改为localRoot,可能问题就解决了。 我希望它有用。