python 自平衡二叉查找树
时间: 2024-07-23 19:01:39 浏览: 90
Python 中的自平衡二叉查找树,通常是指一种数据结构,它保持了二叉搜索树的基本性质(即对于每个节点,其左子树的所有节点值都小于该节点,右子树的所有节点值都大于该节点),同时通过一些策略自动调整其高度,以保证在插入、删除和查找操作的时间复杂度尽可能接近 O(log n)。常见的自平衡二叉查找树有:
1. **AVL树**:这是最早的自平衡二叉查找树之一,它的每个节点都有两个非空子树的高度差不超过1,并通过旋转操作来维持平衡。
2. **红黑树**:另一种常用的自平衡二叉查找树,它的每个节点都被标记为红色或黑色,通过颜色规则和特定的旋转操作确保树的平衡。
3. **B树和B+树**:主要用于文件系统等对磁盘I/O优化的场景,它们能在多级存储设备上高效地存储大量数据。
4. **伸展树(Splay Tree)**:一种动态自适应的数据结构,通过将最近访问过的元素提升到根部来提高性能。
5. **Treap**:随机化的一种自平衡树,利用堆的特性维护平衡。
使用 Python 的库如 `sortedcontainers` 或者内置的 `bisect` 模块可以方便地操作部分实现了自平衡特性的数据结构,但如果你需要直接创建和操作自平衡二叉查找树,可能会选择使用第三方库,如 `avl_tree` 或 `rbtree` 等。
相关问题
数据结构二叉查找树AVL
AVL树是一种自平衡二叉查找树,它的每个节点都保存了一个平衡因子(balance factor),用于判断是否需要进行旋转操作来保持树的平衡。AVL树的平衡因子可以是-1、0或1,当插入或删除节点后,如果某个节点的平衡因子的绝对值大于1,则需要进行旋转操作来保持树的平衡。AVL树的查找、插入和删除操作的时间复杂度都是O(log n)。
以下是一个简单的Python实现AVL树的例子:
```python
class AVLNode:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
self.height = 1
class AVLTree:
def __init__(self):
self.root = None
def insert(self, key):
self.root = self._insert(self.root, key)
def _insert(self, node, key):
if not node:
return AVLNode(key)
elif key < node.key:
node.left = self._insert(node.left, key)
else:
node.right = self._insert(node.right, key)
node.height = 1 + max(self._height(node.left), self._height(node.right))
balance = self._balance(node)
if balance > 1 and key < node.left.key:
return self._right_rotate(node)
if balance < -1 and key > node.right.key:
return self._left_rotate(node)
if balance > 1 and key > node.left.key:
node.left = self._left_rotate(node.left)
return self._right_rotate(node)
if balance < -1 and key < node.right.key:
node.right = self._right_rotate(node.right)
return self._left_rotate(node)
return node
def delete(self, key):
self.root = self._delete(self.root, key)
def _delete(self, node, key):
if not node:
return node
elif key < node.key:
node.left = self._delete(node.left, key)
elif key > node.key:
node.right = self._delete(node.right, key)
else:
if not node.left and not node.right:
node = None
elif not node.left:
node = node.right
elif not node.right:
node = node.left
else:
temp = self._get_min(node.right)
node.key = temp.key
node.right = self._delete(node.right, temp.key)
if not node:
return node
node.height = 1 + max(self._height(node.left), self._height(node.right))
balance = self._balance(node)
if balance > 1 and self._balance(node.left) >= 0:
return self._right_rotate(node)
if balance < -1 and self._balance(node.right) <= 0:
return self._left_rotate(node)
if balance > 1 and self._balance(node.left) < 0:
node.left = self._left_rotate(node.left)
return self._right_rotate(node)
if balance < -1 and self._balance(node.right) > 0:
node.right = self._right_rotate(node.right)
return self._left_rotate(node)
return node
def _height(self, node):
if not node:
return 0
return node.height
def _balance(self, node):
if not node:
return 0
return self._height(node.left) - self._height(node.right)
def _left_rotate(self, node):
new_root = node.right
node.right = new_root.left
new_root.left = node
node.height = 1 + max(self._height(node.left), self._height(node.right))
new_root.height = 1 + max(self._height(new_root.left), self._height(new_root.right))
return new_root
def _right_rotate(self, node):
new_root = node.left
node.left = new_root.right
new_root.right = node
node.height = 1 + max(self._height(node.left), self._height(node.right))
new_root.height = 1 + max(self._height(new_root.left), self._height(new_root.right))
return new_root
def _get_min(self, node):
if not node.left:
return node
return self._get_min(node.left)
def inorder_traversal(self):
self._inorder_traversal(self.root)
def _inorder_traversal(self, node):
if node:
self._inorder_traversal(node.left)
print(node.key)
self._inorder_traversal(node.right)
tree = AVLTree()
tree.insert(10)
tree.insert(20)
tree.insert(30)
tree.insert(40)
tree.insert(50)
tree.insert(25)
tree.delete(30)
tree.inorder_traversal()
```
二叉排序树和二叉平衡树nefu数据结构课程设计
### 关于二叉排序树和二叉平衡树
#### 二叉排序树 (Binary Search Tree, BST)
二叉排序树是一种特殊的二叉树,其特性在于对于任意节点`n`而言:
- `n`的左子树中的所有节点的关键字均小于`n`的关键字;
- `n`的右子树中的所有节点的关键字均大于`n`的关键字。
这种性质使得二叉排序树非常适合用于快速查找、插入以及删除操作。当构建一棵接近完全二叉树形态的理想状态下的BST时,这些基本操作的时间复杂度可以达到O(log n)[^1]。
```python
class TreeNode:
def __init__(self, key=None):
self.key = key
self.left = None
self.right = None
def insert(root, key):
if root is None:
return TreeNode(key)
if key < root.key:
root.left = insert(root.left, key)
elif key > root.key:
root.right = insert(root.right, key)
return root
```
#### 二叉平衡树 (Balanced Binary Tree)
为了克服普通二叉排序树可能退化成链表的情况(最坏情况下时间复杂度会变为O(n)),引入了自调整机制来保持树的高度尽可能低,即所谓的“平衡”。常见的实现方式包括AVL树和红黑树等。这里以AVL为例说明如何维持树的平衡属性。
每当执行一次插入或删除之后都需要检查并维护当前节点及其祖先节点之间的高度差不超过1。如果违反此条件,则通过旋转操作重新排列部分子树结构从而恢复整个树的平衡性。
```python
# AVL Node definition remains similar to above but with additional height attribute.
class AVLNode(TreeNode):
def __init__(self, key=None):
super().__init__(key=key)
self.height = 1
def get_height(node):
if not node:
return 0
return node.height
def update_height(node):
if node:
node.height = max(get_height(node.left), get_height(node.right)) + 1
def rotate_left(z):
y = z.right
T2 = y.left
# Perform rotation
y.left = z
z.right = T2
# Update heights after rotations
update_height(z)
update_height(y)
return y
def rotate_right(z):
y = z.left
T3 = y.right
# Perform rotation
y.right = z
z.left = T3
# Update heights after rotations
update_height(z)
update_height(y)
return y
```
阅读全文