【问题标题】:AVL Right RotateAVL 右旋转
【发布时间】:2013-10-26 09:29:22
【问题描述】:

我正在尝试理解 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;
}

【问题讨论】:

    标签: c avl-tree


    【解决方案1】:

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

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

    有用吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多