AVL树旋转的目的是为了保持树的平衡,但旋转操作的确会在树平衡的情况下发生。这是因为当插入或删除节点后,AVL树可能会产生不平衡的节点,即节点的左子树和右子树的高度差超过1。为了重新平衡树,需要进行旋转操作。下面是旋转操作的示例代码:
class AVLTree:
def __init__(self):
self.root = None
def add(self, val):
if not self.root:
self.root = Node(val)
else:
self.root = self._add(val, self.root)
def _add(self, val, node):
if not node:
return Node(val)
elif node.val > val:
node.left = self._add(val, node.left)
else:
node.right = self._add(val, node.right)
node = self._balance(node)
node.height = 1 + max(
self._get_height(node.left),
self._get_height(node.right))
return node
def _get_height(self, node):
if not node:
return 0
else:
return node.height
def _get_balance(self, node):
if not node:
return 0
else:
return self._get_height(node.left) - self._get_height(node.right)
def _balance(self, node):
if self._get_balance(node) < -1:
if self._get_balance(node.right) > 0:
node.right = self._right_rotate(node.right)
node = self._left_rotate(node)
elif self._get_balance(node) > 1:
if self._get_balance(node.left) < 0:
node.left = self._left_rotate(node.left)
node = self._right_rotate(node)
return node
def _left_rotate(self, node):
r = node.right
node.right = r.left
r.left = node
上一篇:AVL树的删除函数无法正常工作。