python实现平衡二叉树算法的代码
时间: 2023-09-05 21:05:37 浏览: 147
python 平衡二叉树实现代码示例
### 回答1:
平衡二叉树(Balanced Binary Tree)是指一棵二叉树,其中任意节点的两棵子树的高度差不超过 1。常见的平衡二叉树有红黑树、AVL 树等。下面是一个用 Python 实现 AVL 树的简单示例代码:
```
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.height = 1
class AVLTree:
def insert(self, root, key):
# Step 1 - Perform normal BST
if not root:
return Node(key)
elif key < root.val:
root.left = self.insert(root.left, key)
else:
root.right = self.insert(root.right, key)
# Step 2 - Update the height of the ancestor node
root.height = 1 + max(self.getHeight(root.left), self.getHeight(root.right))
# Step 3 - Get the balance factor
balance = self.getBalance(root)
# Step 4 - If the node is unbalanced, then try out the 4 cases
# Case 1 - Left Left
if balance > 1 and key < root.left.val:
return self.rightRotate(root)
# Case 2 - Right Right
if balance < -1 and key > root.right.val:
return self.leftRotate(root)
# Case 3 - Left Right
if balance > 1 and key > root.left.val:
root.left = self.leftRotate(root.left)
return self.rightRotate(root)
# Case 4 - Right Left
if balance < -1 and key < 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
# Perform rotation
y.left = z
z.right = T2
# Update heights
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 the new root
return y
def rightRotate(self, z):
y = z.left
T3 = y.right
# Perform rotation
y.right = z
z.left = T3
# Update heights
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 the new root
### 回答2:
平衡二叉树是一种特殊的二叉树,它的左右子树的高度差不超过1。下面是用Python实现平衡二叉树算法的代码:
```python
# 定义二叉树节点
class TreeNode:
def __init__(self, val=0):
self.val = val
self.left = None
self.right = None
# 计算节点高度
def height(node):
if node is None:
return 0
return max(height(node.left), height(node.right)) + 1
# 判断二叉树是否平衡
def is_balanced(root):
if root is None:
return True
left_height = height(root.left)
right_height = height(root.right)
if abs(left_height - right_height) <= 1 and is_balanced(root.left) and is_balanced(root.right):
return True
return False
# 构造平衡二叉树
def construct_balanced_tree(arr):
if not arr:
return None
mid = len(arr) // 2
root = TreeNode(arr[mid])
root.left = construct_balanced_tree(arr[:mid])
root.right = construct_balanced_tree(arr[mid+1:])
return root
# 测试代码
arr = [1, 2, 3, 4, 5, 6, 7]
root = construct_balanced_tree(arr)
print(is_balanced(root)) # 输出 True
```
上面的代码中,首先定义了一个二叉树节点类,包含节点值以及左右子节点。`height()`函数用来计算二叉树的高度,通过递归计算左右子树的高度并取最大值再加1得到节点的高度。`is_balanced()`函数用来判断二叉树是否平衡,如果根节点为None,则返回True;否则计算左右子树的高度差,如果小于等于1且左右子树均为平衡二叉树,则返回True,否则返回False。`construct_balanced_tree()`函数用来构造一个平衡二叉树,通过取中间位置的值作为根节点递归构造左右子树。最后,通过构造一个二叉树并判断其是否是平衡二叉树,输出结果为True。
### 回答3:
平衡二叉树是一种特殊的二叉树,其中任意节点的左子树和右子树的高度差最多为1,也就是说树的左右两边保持平衡。实现平衡二叉树的算法有很多,下面给出一种使用Python语言实现的代码。
```python
# 定义二叉树节点类
class Node:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
# 计算节点的高度
def height(node):
if node is None:
return 0
else:
return max(height(node.left), height(node.right)) + 1
# 判断树是否平衡
def is_balanced(node):
if node is None:
return True
# 计算左右子树的高度差
height_diff = abs(height(node.left) - height(node.right))
# 判断左右子树的高度差是否超过1
if height_diff > 1:
return False
else:
return is_balanced(node.left) and is_balanced(node.right)
# 创建平衡二叉树
def create_balanced_tree(arr, start, end):
if start > end:
return None
# 计算中间节点的位置
mid = (start + end) // 2
# 创建中间节点
node = Node(arr[mid])
# 递归创建左子树和右子树
node.left = create_balanced_tree(arr, start, mid - 1)
node.right = create_balanced_tree(arr, mid + 1, end)
return node
# 测试代码
arr = [1, 2, 3, 4, 5, 6, 7]
root = create_balanced_tree(arr, 0, len(arr) - 1)
print(is_balanced(root))
```
以上代码中,我们首先定义了一个二叉树节点类。然后定义了一个函数来计算节点的高度,该函数是通过递归计算左子树和右子树的最大高度,并加1得到的。接下来,我们实现了一个函数来判断二叉树是否平衡,该函数也是通过递归判断左子树和右子树的高度差是否大于1来判断的。最后,我们定义了一个函数来创建平衡二叉树,该函数使用了二分法来创建树的节点,并按照中序遍历的顺序构建平衡二叉树。最后,我们对一个示例数组进行测试,输出该二叉树是否平衡。
阅读全文