【问题标题】:AVL Tree Deletion using Recursion使用递归的 AVL 树删除
【发布时间】:2014-05-01 08:59:46
【问题描述】:

令 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;
}

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

【问题讨论】:

    标签: c algorithm data-structures avl-tree recursive-datastructures


    【解决方案1】:

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

    【讨论】:

    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2013-03-22
    • 1970-01-01
    相关资源
    最近更新 更多