C++中如何实现一个平衡二叉搜索树,并给出一个插入操作的示例代码?
时间: 2024-11-28 12:29:33 浏览: 29
平衡二叉搜索树,如AVL树,是一种自平衡的二叉搜索树,在插入或删除节点后,能够保持树的高度差不超过1。这保证了操作的时间复杂度始终为O(log n)。要实现一个平衡二叉搜索树,你需要定义节点结构,实现树的插入操作,并在每次插入后检查和维护树的平衡性。在《数据结构与算法分析》这本书中,你可以找到关于AVL树的详细描述和实现方法。以下是使用C++实现AVL树插入操作的示例代码:
参考资源链接:[《数据结构与算法分析》第三版——Clifford A. Shaffer](https://wenku.csdn.net/doc/6mtn81nrui?spm=1055.2569.3001.10343)
```cpp
struct AVLNode {
int key;
int height;
AVLNode *left;
AVLNode *right;
};
int height(AVLNode *N) {
if (N == nullptr)
return 0;
return N->height;
}
int getBalance(AVLNode *N) {
if (N == nullptr)
return 0;
return height(N->left) - height(N->right);
}
AVLNode* rightRotate(AVLNode *y) {
AVLNode *x = y->left;
AVLNode *T2 = x->right;
x->right = y;
y->left = T2;
y->height = max(height(y->left), height(y->right)) + 1;
x->height = max(height(x->left), height(x->right)) + 1;
return x;
}
AVLNode* leftRotate(AVLNode *x) {
AVLNode *y = x->right;
AVLNode *T2 = y->left;
y->left = x;
x->right = T2;
x->height = max(height(x->left), height(x->right)) + 1;
y->height = max(height(y->left), height(y->right)) + 1;
return y;
}
AVLNode* insert(AVLNode* node, int key) {
/* 1. 正常的BST插入 */
if (node == nullptr)
return(new AVLNode{key, 1, nullptr, nullptr});
if (key < node->key)
node->left = insert(node->left, key);
else if (key > node->key)
node->right = insert(node->right, key);
else
return node; // 相等的键不允许在BST中
/* 2. 更新height */
node->height = 1 + max(height(node->left), height(node->right));
/* 3. 获取平衡因子,检查是否失衡 */
int balance = getBalance(node);
// 如果节点失衡,则有四种情况
// 左左情况
if (balance > 1 && key < node->left->key)
return rightRotate(node);
// 右右情况
if (balance < -1 && key > node->right->key)
return leftRotate(node);
// 左右情况
if (balance > 1 && key > node->left->key) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
// 右左情况
if (balance < -1 && key < node->right->key) {
node->right = rightRotate(node->right);
return leftRotate(node);
}
/* 返回未失衡的节点 */
return node;
}
```
在上述代码中,我们定义了AVL树节点的结构,并实现了插入操作,包括对树的平衡性的检查和维护。如果你对如何实现和使用AVL树感兴趣,我强烈推荐你阅读《数据结构与算法分析》这本书。书中详细讲解了平衡二叉搜索树的概念,以及如何在C++中实现这些复杂的数据结构和算法,非常适合教育和学术用途。通过本书,你可以深入理解数据结构和算法分析的原理,进一步提升你的编程技能和计算机科学素养。
参考资源链接:[《数据结构与算法分析》第三版——Clifford A. Shaffer](https://wenku.csdn.net/doc/6mtn81nrui?spm=1055.2569.3001.10343)
阅读全文