python 用AVL树实现字典类型
时间: 2023-12-02 21:52:20 浏览: 104
[10.5.1]--614AVL树的Python实现.mp4
AVL树是一种自平衡二叉搜索树,可以用来实现字典类型。在实现字典类型时,我们可以将键值对存储在AVL树的节点中,其中键作为节点的关键字,值则作为节点的附加数据。
下面是一个简单的AVL树实现字典类型的Python代码:
```python
class AVLNode:
def __init__(self, key, val):
self.key = key
self.val = val
self.left = None
self.right = None
self.height = 1
class AVLTree:
def __init__(self):
self.root = None
def insert(self, key, val):
self.root = self._insert(self.root, key, val)
def _insert(self, node, key, val):
if not node:
return AVLNode(key, val)
if key < node.key:
node.left = self._insert(node.left, key, val)
elif key > node.key:
node.right = self._insert(node.right, key, val)
else:
node.val = val
node.height = 1 + max(self._height(node.left), self._height(node.right))
balance = self._get_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 search(self, key):
node = self._search(self.root, key)
if node:
return node.val
else:
return None
def _search(self, node, key):
if not node:
return None
if key == node.key:
return node
if key < node.key:
return self._search(node.left, key)
else:
return self._search(node.right, key)
def _height(self, node):
if not node:
return 0
return node.height
def _get_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
```
在这个实现中,我们定义了AVLNode类来表示AVL树的节点。每个节点包含一个键、一个值、左右子树指针以及节点高度。AVLTree类是AVL树的实现,包含了插入、搜索、左旋和右旋等基本操作。
在insert操作中,我们首先按照二叉搜索树的规则找到要插入的位置。然后更新节点高度,并计算平衡因子。如果平衡因子超过了1或-1,我们就需要进行旋转来保持AVL树的平衡。
在search操作中,我们按照二叉搜索树的规则搜索键值对应的节点,并返回其值。
这个AVL树实现可以用来实现字典类型。我们可以将键值对存储在AVL树的节点中,并通过搜索操作来查找键对应的值。
阅读全文