C 使用递归删除AVL树

C 使用递归删除AVL树,c,algorithm,data-structures,avl-tree,recursive-datastructures,C,Algorithm,Data Structures,Avl Tree,Recursive Datastructures,设x=要删除的节点 在旋转过程中,如果在节点的结构声明中没有父指针,我如何使用C编码的AVL树实现中的递归将x的父节点的左或右指针重新分配给x的左或右子树 我的节点的结构声明: typedef struct Node{ int key; struct Node *left; struct Node *right; int height; }node; 目前,以下是我的轮换代码: void rotateRight(node **n){ node *lCh

设x=要删除的节点

在旋转过程中,如果在节点的结构声明中没有父指针,我如何使用C编码的AVL树实现中的递归将x的父节点的左或右指针重新分配给x的左或右子树

我的节点的结构声明:

typedef struct Node{
    int key;
    struct Node *left;
    struct Node *right;
    int height;
}node;
目前,以下是我的轮换代码:

void rotateRight(node **n){

    node *lChild = (*n)->left;
    node *subtree = lChild->right;

    // Rotate Right
    lChild->right = *n;
    (*n)->left = subtree;
    *n = lChild;

    // Update Height
    lChild->right->height = max(getHeight(lChild->right->left), getHeight(lChild->right->right)) + 1;
    (*n)->height = max(getHeight((*n)->left), getHeight((*n)->right)) + 1;
}

void rotateLeft(node **n){

    node *rChild = (*n)->right;
    node *subtree = rChild->left;

    // Rotate Left
    rChild->left = *n;
    (*n)->right = subtree;
    *n = rChild;

    // Update Height
    rChild->left->height = max(getHeight(rChild->left->left), getHeight(rChild->left->right)) + 1;
    (*n)->height = max(getHeight((*n)->left), getHeight((*n)->right)) + 1;
}

当我执行这些旋转代码时,我丢失了一些本不应该删除的元素。

您不能。向结构中添加指向父级的指针,或者以在每一级上传递节点和父级的方式编写递归,这样您就可以将父级作为第二个参数传递给旋转函数。

谢谢您的回复,也为我节省了时间。我认为这是可能的,但我在这里看到了一个AVL树的实现,它的结构中没有父成员: