defleft_rotate(tree, x): """左旋转操作""" # 设置 y 为 x 的右子节点 y = x.right # 将 y 的左子树设置为 x 的右子树 x.right = y.left if y.left != tree.nil: y.left.parent = x # 更新 y 的父节点 y.parent = x.parent if x.parent == tree.nil: tree.root = y elif x == x.parent.left: x.parent.left = y else: x.parent.right = y # 将 x 设置为 y 的左子节点 y.left = x x.parent = y
defright_rotate(tree, x): """右旋转操作""" # 设置 y 为 x 的左子节点 y = x.left # 将 y 的右子树设置为 x 的左子树 x.left = y.right if y.right != tree.nil: y.right.parent = x # 更新 y 的父节点 y.parent = x.parent if x.parent == tree.nil: tree.root = y elif x == x.parent.left: x.parent.left = y else: x.parent.right = y # 将 x 设置为 y 的右子节点 y.right = x x.parent = y
classRBNode: """红黑树节点""" def__init__(self, key, color='RED', left=None, right=None, parent=None): self.key = key self.color = color # 'RED' 或 'BLACK' self.left = left self.right = right self.parent = parent
classRedBlackTree: """红黑树""" def__init__(self): # NIL节点:所有叶子节点都指向这个黑色哨兵节点 self.nil = RBNode(None, 'BLACK') self.root = self.nil definsert(self, key): """插入节点""" z = RBNode(key) z.left = self.nil z.right = self.nil z.color = 'RED' y = self.nil x = self.root # 标准的BST插入过程 while x != self.nil: y = x if z.key < x.key: x = x.left else: x = x.right z.parent = y if y == self.nil: self.root = z elif z.key < y.key: y.left = z else: y.right = z # 修复红黑树特性 self._insert_fixup(z) def_insert_fixup(self, z): """插入后修复""" while z.parent.color == 'RED': if z.parent == z.parent.parent.left: y = z.parent.parent.right if y.color == 'RED': z.parent.color = 'BLACK' y.color = 'BLACK' z.parent.parent.color = 'RED' z = z.parent.parent else: if z == z.parent.right: z = z.parent self._left_rotate(z) z.parent.color = 'BLACK' z.parent.parent.color = 'RED' self._right_rotate(z.parent.parent) else: y = z.parent.parent.left if y.color == 'RED': z.parent.color = 'BLACK' y.color = 'BLACK' z.parent.parent.color = 'RED' z = z.parent.parent else: if z == z.parent.left: z = z.parent self._right_rotate(z) z.parent.color = 'BLACK' z.parent.parent.color = 'RED' self._left_rotate(z.parent.parent) self.root.color = 'BLACK' def_left_rotate(self, x): """左旋转""" y = x.right x.right = y.left if y.left != self.nil: y.left.parent = x y.parent = x.parent if x.parent == self.nil: self.root = y elif x == x.parent.left: x.parent.left = y else: x.parent.right = y y.left = x x.parent = y def_right_rotate(self, x): """右旋转""" y = x.left x.left = y.right if y.right != self.nil: y.right.parent = x y.parent = x.parent if x.parent == self.nil: self.root = y elif x == x.parent.left: x.parent.left = y else: x.parent.right = y y.right = x x.parent = y defsearch(self, key): """搜索节点""" x = self.root while x != self.nil and key != x.key: if key < x.key: x = x.left else: x = x.right return x definorder_traverse(self, node=None, result=None): """中序遍历""" if result isNone: result = [] if node isNone: node = self.root if node != self.nil: self.inorder_traverse(node.left, result) result.append((node.key, node.color)) self.inorder_traverse(node.right, result) return result