用python与图示解释avl
时间: 2023-12-06 21:43:48 浏览: 62
AVL树是一种自平衡二叉搜索树,它的平衡是通过旋转操作来实现的。下面是一个简单的python代码示例,用于插入一个节点并保持AVL树的平衡。
```python
class AVLNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.height = 1
class AVLTree:
def insert(self, root, val):
# 插入节点
if not root:
return AVLNode(val)
elif val < root.val:
root.left = self.insert(root.left, val)
else:
root.right = self.insert(root.right, val)
# 更新节点高度
root.height = 1 + max(self.getHeight(root.left), self.getHeight(root.right))
# 判断是否需要旋转
balance = self.getBalance(root)
# 左旋
if balance > 1 and val < root.left.val:
return self.rightRotate(root)
# 右旋
if balance < -1 and val > root.right.val:
return self.leftRotate(root)
# 左右旋
if balance > 1 and val > root.left.val:
root.left = self.leftRotate(root.left)
return self.rightRotate(root)
# 右左旋
if balance < -1 and val < root.right.val:
root.right = self.rightRotate(root.right)
return self.leftRotate(root)
return root
def leftRotate(self, z):
y = z.right
T2 = y.left
y.left = z
z.right = T2
z.height = 1 + max(self.getHeight(z.left), self.getHeight(z.right))
y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right))
return y
def rightRotate(self, z):
y = z.left
T3 = y.right
y.right = z
z.left = T3
z.height = 1 + max(self.getHeight(z.left), self.getHeight(z.right))
y.height = 1 + max(self.getHeight(y.left), self.getHeight(y.right))
return y
def getHeight(self, root):
if not root:
return 0
return root.height
def getBalance(self, root):
if not root:
return 0
return self.getHeight(root.left) - self.getHeight(root.right)
```
下面是一个简单的AVL树示意图:
![AVL树示意图](https://i.imgur.com/f1Aojm4.png)
在这个示意图中,我们可以看到AVL树的每个节点都有一个高度值,用于判断是否需要旋转来保持平衡。当插入节点导致不平衡的时候,我们需要进行一些旋转操作来重新平衡树。左旋和右旋操作是最基本的旋转操作,而左右旋和右左旋则是两个基本旋转操作的组合。在执行旋转操作时,我们需要注意更新节点的高度值,以便在后续的插入操作中正确地判断是否需要旋转。
阅读全文