python实现平衡二叉树代码
时间: 2023-08-31 11:32:22 浏览: 122
python 平衡二叉树实现代码示例
### 回答1:
以下是一个简单的 Python 实现平衡二叉树 (AVL Tree) 的代码示例:
```python
class Node:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
self.height = 1
class AVL_Tree:
def insert(self, root, key):
if not root:
return Node(key)
elif key < root.key:
root.left = self.insert(root.left, key)
else:
root.right = self.insert(root.right, key)
root.height = 1 + max(self.getHeight(root.left),
self.getHeight(root.right))
balance = self.getBalance(root)
if balance > 1 and key < root.left.key:
return self.rightRotate(root)
if balance < -1 and key > root.right.key:
return self.leftRotate(root)
if balance > 1 and key > root.left.key:
root.left = self.leftRotate(root.left)
return self.rightRotate(root)
if balance < -1 and key < root.right.key:
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_Tree 类,并调
### 回答2:
平衡二叉树(AVL树)是一种自平衡的二叉搜索树,任何节点的左子树和右子树的高度最多相差1。下面是用Python实现平衡二叉树的代码:
```python
# 定义二叉树节点类
class TreeNode:
def __init__(self, value):
self.data = value
self.left = None
self.right = None
self.height = 1 # 节点的高度,默认为1
# 获取节点的高度
def get_height(node):
if node is None:
return 0
return node.height
# 获取节点的平衡因子
def get_balance(node):
if node is None:
return 0
return get_height(node.left) - get_height(node.right)
# 左旋操作
def left_rotate(z):
y = z.right
T2 = y.left
y.left = z
z.right = T2
z.height = max(get_height(z.left), get_height(z.right)) + 1
y.height = max(get_height(y.left), get_height(y.right)) + 1
return y
# 右旋操作
def right_rotate(z):
y = z.left
T3 = y.right
y.right = z
z.left = T3
z.height = max(get_height(z.left), get_height(z.right)) + 1
y.height = max(get_height(y.left), get_height(y.right)) + 1
return y
# 插入节点
def insert_node(root, value):
if root is None:
return TreeNode(value)
elif value < root.data:
root.left = insert_node(root.left, value)
else:
root.right = insert_node(root.right, value)
root.height = max(get_height(root.left), get_height(root.right)) + 1
# 检测树的平衡性
balance_factor = get_balance(root)
# 左左情况,进行右旋操作
if balance_factor > 1 and value < root.left.data:
return right_rotate(root)
# 右右情况,进行左旋操作
if balance_factor < -1 and value > root.right.data:
return left_rotate(root)
# 左右情况,先左旋再右旋
if balance_factor > 1 and value > root.left.data:
root.left = left_rotate(root.left)
return right_rotate(root)
# 右左情况,先右旋再左旋
if balance_factor < -1 and value < root.right.data:
root.right = right_rotate(root.right)
return left_rotate(root)
return root
# 中序遍历,打印平衡二叉树
def in_order_traversal(root):
if root:
in_order_traversal(root.left)
print(root.data, end=" ")
in_order_traversal(root.right)
# 测试代码
root = None
root = insert_node(root, 10)
root = insert_node(root, 20)
root = insert_node(root, 30)
root = insert_node(root, 40)
root = insert_node(root, 50)
root = insert_node(root, 25)
print("平衡二叉树:")
in_order_traversal(root)
```
以上代码实现了平衡二叉树的插入操作,并进行了相应的旋转操作来维持平衡。可以通过中序遍历验证平衡二叉树的正确性。
### 回答3:
平衡二叉树(AVL树)是一种特殊的二叉搜索树,它的左右子树的高度差不超过1。
实现平衡二叉树的代码,主要包含以下几个步骤:
1. 定义二叉树的节点类,包含节点值、左子节点、右子节点和高度等属性。
2. 定义平衡二叉树类,包含插入节点、删除节点、左旋转、右旋转、计算节点高度等方法。
3. 在插入节点、删除节点等操作中,通过判断节点的左子树和右子树的高度差,来判断是否需要进行旋转操作以保持树的平衡。
4. 左旋转和右旋转是平衡二叉树中常用的平衡操作,可以通过调整节点的左右子节点来保持树的平衡。
5. 计算节点的高度时,需要递归计算节点的左子树和右子树的高度,然后取较大值加1作为节点的高度。
6. 实现其他常用方法,如查找节点、遍历树等。
下面是一种可能的Python实现平衡二叉树的代码示例:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.height = 1
class AVLTree:
def __init__(self):
self.root = None
def insert(self, root, val):
if not root:
return TreeNode(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.get_height(root.left), self.get_height(root.right))
balance = self.get_balance(root)
if balance > 1 and val < root.left.val:
return self.right_rotate(root)
if balance < -1 and val > root.right.val:
return self.left_rotate(root)
if balance > 1 and val > root.left.val:
root.left = self.left_rotate(root.left)
return self.right_rotate(root)
if balance < -1 and val < root.right.val:
root.right = self.right_rotate(root.right)
return self.left_rotate(root)
return root
def delete(self, root, val):
if not root:
return root
elif val < root.val:
root.left = self.delete(root.left, val)
elif val > root.val:
root.right = self.delete(root.right, val)
else:
if not root.left:
temp = root.right
root = None
return temp
elif not root.right:
temp = root.left
root = None
return temp
temp = self.get_min_value_node(root.right)
root.val = temp.val
root.right = self.delete(root.right, temp.val)
root.height = 1 + max(self.get_height(root.left), self.get_height(root.right))
balance = self.get_balance(root)
if balance > 1 and self.get_balance(root.left) >= 0:
return self.right_rotate(root)
if balance < -1 and self.get_balance(root.right) <= 0:
return self.left_rotate(root)
if balance > 1 and self.get_balance(root.left) < 0:
root.left = self.left_rotate(root.left)
return self.right_rotate(root)
if balance < -1 and self.get_balance(root.right) > 0:
root.right = self.right_rotate(root.right)
return self.left_rotate(root)
return root
def left_rotate(self, z):
y = z.right
T2 = y.left
y.left = z
z.right = T2
z.height = 1 + max(self.get_height(z.left), self.get_height(z.right))
y.height = 1 + max(self.get_height(y.left), self.get_height(y.right))
return y
def right_rotate(self, z):
y = z.left
T3 = y.right
y.right = z
z.left = T3
z.height = 1 + max(self.get_height(z.left), self.get_height(z.right))
y.height = 1 + max(self.get_height(y.left), self.get_height(y.right))
return y
def get_height(self, root):
if not root:
return 0
return root.height
def get_balance(self, root):
if not root:
return 0
return self.get_height(root.left) - self.get_height(root.right)
def get_min_value_node(self, root):
if root is None or root.left is None:
return root
return self.get_min_value_node(root.left)
def search(self, root, val):
if not root or root.val == val:
return root
elif root.val < val:
return self.search(root.right, val)
else:
return self.search(root.left, val)
def inorder_traversal(self, root):
res = []
if root:
res = self.inorder_traversal(root.left)
res.append(root.val)
res = res + self.inorder_traversal(root.right)
return res
```
注意,这只是一种可能的实现,实际的代码可能会有所不同。可以根据具体需求和算法原理进行调整。
阅读全文