python怎么创建平衡二叉树
平衡二叉树(AVL树)是一种非常常见的数据结构,它具有高效的查找、插入和删除操作。为了创建一个平衡二叉树,需要了解平衡二叉树的定义、性质以及实现方式。
1. 平衡二叉树的定义
平衡二叉树是一种特殊的二叉搜索树,它具有以下性质:
- 对于任意一个节点,左子树和右子树的高度差不超过1。
- 平衡二叉树的左子树和右子树也是平衡二叉树。
平衡二叉树的定义保证了它具有平衡性,即它的左右子树的高度差不超过1,这使得它的查找、插入和删除操作具有良好的时间复杂度。
2. 实现方式
实现平衡二叉树可以采用递归和非递归两种方法。其中,递归方法比非递归方法更简单易懂,但非递归方法的效率更高。
2.1 递归方法
创建平衡二叉树的递归方法通常包括以下步骤:
- 首先,创建一个新节点,将要插入的数据存储在该节点中。
- 然后,将该节点插入到二叉搜索树中,如果二叉搜索树为空,则该节点作为根节点。
- 接下来,检查根节点的左子树和右子树的高度差是否超过1,如果超过1,则需要进行平衡操作。平衡操作通常分为四种情况:LL、RR、LR和RL,具体操作方法见下面的代码片段。
- 最后,递归地处理左子树和右子树,直到所有节点插入完毕。
以下是使用递归方法创建平衡二叉树的代码示例:
class AVLNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
self.height = 1
class AVLTree:
def insert(self, root, data):
if not root:
return AVLNode(data)
elif data < root.data:
root.left = self.insert(root.left, data)
else:
root.right = self.insert(root.right, data)
root.height = 1 + max(self.getHeight(root.left),
self.getHeight(root.right))
balance = self.getBalance(root)
if balance > 1 and data < root.left.data:
return self.rightRotate(root)
if balance < -1 and data > root.right.data:
return self.leftRotate(root)
if balance > 1 and data > root.left.data:
root.left = self.leftRotate(root.left)
return self.rightRotate(root)
if balance < -1 and data < root.right.data:
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)
2.2 非递归方法
非递归方法的实现方式通常使用栈来模拟递归过程。具体方法如下:
- 首先,创建一个新节点,将要插入的数据存储在该节点中。
- 然后,将创建的节点插入到二叉搜索树中,如果二叉搜索树为空,则该节点作为根节点。
- 接下来,检查根节点的左子树和右子树的高度差是否超过1,如果超过1,则需要进行平衡操作。平衡操作通常分为四种情况:LL、RR、LR和RL,具体操作方法见下面的代码片段。
- 最后,利用栈模拟递归过程,逐个处理每个节点,直到所有节点插入完毕。
以下是使用非递归方法创建平衡二叉树的代码示例:
class AVLNode:
def __init__(self, data=0, height=1, left=None, right=None):
self.data = data
self.height = height
self.left = left
self.right = right
class AVLTree:
def insert(self, root, data):
stack = []
if not root:
return AVLNode(data=data)
stack.append(root)
while stack:
curr = stack.pop()
if data < curr.data:
if not curr.left:
curr.left = AVLNode(data=data)
else:
stack.append(curr.left)
else:
if not curr.right:
curr.right = AVLNode(data=data)
else:
stack.append(curr.right)
curr.height = 1 + max(self.getHeight(curr.left),
self.getHeight(curr.right))
balance = self.getBalance(curr)
if balance > 1 and data < curr.left.data:
return self.rightRotate(curr)
if balance < -1 and data > curr.right.data:
return self.leftRotate(curr)
if balance > 1 and data > curr.left.data:
curr.left = self.leftRotate(curr.left)
return self.rightRotate(curr)
if balance < -1 and data < curr.right.data:
curr.right = self.rightRotate(curr.right)
return self.leftRotate(curr)
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)
以上就是创建平衡二叉树的详细介绍和代码示例。
