📜  AVL树|设置1(插入)(1)

📅  最后修改于: 2023-12-03 14:59:25.800000             🧑  作者: Mango

AVL树 | 设置1(插入)

什么是AVL树?

AVL树是一种自平衡二叉搜索树,它的每个节点都有一个平衡因子,用来表示左右子树的高度差。AVL树的平衡因子必须为-1、0、1。

AVL树的插入、删除、查询等操作的时间复杂度都是O(logn),其中n为树中节点的数量。

插入节点

AVL树的插入操作与普通二叉搜索树的插入操作类似,但是需要在插入后维护平衡性。

下面是C++实现示例:

struct TreeNode {
    int val;
    int height;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), height(1), left(nullptr), right(nullptr) {}
};

class AVLTree {
public:
    TreeNode* insert(TreeNode* root, int val) {
        if (!root) return new TreeNode(val);
        if (val < root->val) {
            root->left = insert(root->left, val);
        } else if (val > root->val) {
            root->right = insert(root->right, val);
        } else {
            return root;
        }
        root->height = getHeight(root);
        int balance = getBalance(root);
        if (balance > 1 && val < root->left->val) {
            return rightRotate(root);
        }
        if (balance > 1 && val > root->left->val) {
            root->left = leftRotate(root->left);
            return rightRotate(root);
        }
        if (balance < -1 && val > root->right->val) {
            return leftRotate(root);
        }
        if (balance < -1 && val < root->right->val) {
            root->right = rightRotate(root->right);
            return leftRotate(root);
        }
        return root;
    }
private:
    int getHeight(TreeNode* root) {
        if (!root) return 0; 
        return max(getHeight(root->left), getHeight(root->right)) + 1;
    }
    int getBalance(TreeNode* root) {
        if (!root) return 0; 
        return getHeight(root->left) - getHeight(root->right);
    }
    TreeNode* rightRotate(TreeNode* root) {
        TreeNode* newRoot = root->left;
        root->left = newRoot->right;
        newRoot->right = root;
        root->height = getHeight(root);
        newRoot->height = getHeight(newRoot);
        return newRoot;
    }
    TreeNode* leftRotate(TreeNode* root) {
        TreeNode* newRoot = root->right;
        root->right = newRoot->left;
        newRoot->left = root;
        root->height = getHeight(root);
        newRoot->height = getHeight(newRoot);
        return newRoot;
    }
};
总结

AVL树是一种自平衡二叉搜索树,插入操作需要维护平衡性。AVL树的时间复杂度为O(logn)。