Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 右旋转_C_Avl Tree - Fatal编程技术网

C 右旋转

C 右旋转,c,avl-tree,C,Avl Tree,我正试图理解下面的AVL树代码,但遇到了一些困难。我知道,如果树是左重,它会做一个右旋转。同样的道理,如果它是右重的,它会做一个左旋转。如果有人能解释或为我指出理解以下代码的正确方向,我将不胜感激 static void avl_rotate_right(TLDList *tld, TLDNode *node) { if (node->parent != NULL) { if (node->parent->left == node)

我正试图理解下面的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;
}

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

然后将节点左侧子节点的父节点指定为节点父节点。然后将节点父节点指定为节点的左子节点。然后将节点的左子节点指定为节点左子节点的右子节点。如果节点左子节点不为null,则将节点左子节点的父节点指定为节点如果节点左子节点为null,则将节点父节点右子节点设置为节点

有用吗