0

我正在尝试理解 AVL 树的以下代码,但遇到了一些困难。我知道如果树很重,它会向右旋转。如果它很重,它也会向左旋转。感谢有人可以解释或指出我理解以下代码的正确方向。

static void avl_rotate_right(TLDList *tld, TLDNode *node) {
    if (node->parent != NULL) {
        if (node->parent->left == node)
            node->parent->left = node->left;
        else
            node->parent->right = node->left;
    } else
        tld->root = node->left;

    node->left->parent = node->parent;
    node->parent = node->left;
    node->left = node->left->right;

    if (node->left != NULL)
        node->left->parent = node;
    node->parent->right = node;
}
4

1 回答 1

0

基本上,这段代码正在检查被旋转的节点是否是根节点。如果是这种情况,则将根重新分配为前一个根的左子。如果被旋转的节点不是根节点并且被旋转的节点是左子节点,则将其替换为自己的左子节点,如果是右子节点,则将父节点的右子节点替换为左子节点。

然后将节点left child的父节点分配为节点父节点。然后将节点父节点分配为节点左子节点。然后将节点的左孩子分配为节点左孩子的右孩子。如果节点左子节点不为空,则将节点左子节点的父节点分配为节点,如果节点左子节点为空,则将节点父节点右子节点设置为节点。

有帮助吗?

于 2013-10-26T09:43:13.933 回答