📜  用C++图形实现AVL Tree(1)

📅  最后修改于: 2023-12-03 15:11:14.620000             🧑  作者: Mango

用C++图形实现AVL树

在本文中,我们将介绍如何使用C++图形界面库来实现AVL树。AVL树是一种自平衡的二叉搜索树,它可以在插入和删除节点时保持树的平衡,从而保证了查找操作的时间复杂度为O(log n)。

实现步骤

以下是实现AVL树的步骤:

  1. 定义AVL节点,包括值、左右子节点以及平衡因子。
  2. 实现插入节点函数,需要考虑平衡因子,如果超过了1或-1,则需要进行旋转操作。
  3. 实现删除节点函数,同样需要考虑平衡因子,并进行旋转操作。
  4. 实现旋转操作,包括左旋和右旋。在旋转过程中,需要更新节点的平衡因子。
  5. 实现查找节点函数,采用二叉搜索树的方式实现。
代码实现
定义AVL节点
struct AVLNode {
    int value;
    AVLNode* left;
    AVLNode* right;
    int balanceFactor;
};
插入节点
void insertNode(AVLNode*& root, int value) {
    if (root == nullptr) {
        root = new AVLNode{value, nullptr, nullptr, 0};
    } else if (root->value > value) {
        insertNode(root->left, value);
        root->balanceFactor += (root->left->balanceFactor == 0) ? -1 : 0;
        if (root->balanceFactor < -1) {
            if (root->left->balanceFactor <= 0) {
                rightRotate(root);
            } else {
                leftRightRotate(root);
            }
        }
    } else if (root->value < value) {
        insertNode(root->right, value);
        root->balanceFactor += (root->right->balanceFactor == 0) ? 1 : 0;
        if (root->balanceFactor > 1) {
            if (root->right->balanceFactor >= 0) {
                leftRotate(root);
            } else {
                rightLeftRotate(root);
            }
        }
    }
}
删除节点
void deleteNode(AVLNode*& root, int value) {
    if (root == nullptr) {
        return;
    } else if (root->value > value) {
        deleteNode(root->left, value);
        root->balanceFactor += (root->right == nullptr) ? 1 : 0;
        if (root->balanceFactor > 1) {
            if (root->right->balanceFactor >= 0) {
                leftRotate(root);
            } else {
                rightLeftRotate(root);
            }
        }
    } else if (root->value < value) {
        deleteNode(root->right, value);
        root->balanceFactor += (root->left == nullptr) ? -1 : 0;
        if (root->balanceFactor < -1) {
            if (root->left->balanceFactor <= 0) {
                rightRotate(root);
            } else {
                leftRightRotate(root);
            }
        }
    } else {
        if (root->left == nullptr && root->right == nullptr) {
            delete root;
            root = nullptr;
            return;
        } else if (root->left != nullptr && root->right == nullptr) {
            AVLNode* temp = root;
            root = root->left;
            delete temp;
            return;
        } else if (root->left == nullptr && root->right != nullptr) {
            AVLNode* temp = root;
            root = root->right;
            delete temp;
            return;
        } else {
            AVLNode* temp = findSuccessor(root->right);
            root->value = temp->value;
            deleteNode(root->right, temp->value);
            root->balanceFactor += (root->left == nullptr) ? -1 : 0;
            if (root->balanceFactor < -1) {
                if (root->left->balanceFactor <= 0) {
                    rightRotate(root);
                } else {
                    leftRightRotate(root);
                }
            }
        }
    }
}
单旋转
void leftRotate(AVLNode*& node) {
    AVLNode* right = node->right;
    node->right = right->left;
    right->left = node;
    node->balanceFactor -= 1 + max(right->balanceFactor, 0);
    right->balanceFactor -= 1 - min(node->balanceFactor, 0);
    node = right;
}

void rightRotate(AVLNode*& node) {
    AVLNode* left = node->left;
    node->left = left->right;
    left->right = node;
    node->balanceFactor += 1 - min(left->balanceFactor, 0);
    left->balanceFactor += 1 + max(node->balanceFactor, 0);
    node = left;
}
双旋转
void leftRightRotate(AVLNode*& node) {
    leftRotate(node->left);
    rightRotate(node);
}

void rightLeftRotate(AVLNode*& node) {
    rightRotate(node->right);
    leftRotate(node);
}
查找节点
AVLNode* findNode(AVLNode* root, int value) {
    if (root == nullptr || root->value == value) {
        return root;
    } else if (root->value > value) {
        return findNode(root->left, value);
    } else {
        return findNode(root->right, value);
    }
}
总结

到目前为止,我们已经成功地实现了一个AVL树。在实现过程中,我们需要考虑节点的平衡因子并进行旋转操作,从而保证树的平衡。AVL树是一种比较高效稳定的数据结构,可以用于快速查找和插入节点。如果您对此感兴趣,可以尝试实现其他类型的平衡树!