📅  最后修改于: 2023-12-03 14:59:25.800000             🧑  作者: Mango
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)。