用python语言实现一个红黑树的类
以下是一个基本的红黑树实现,包括节点类和红黑树类:
class RBNode:
def __init__(self, val, color="RED"):
self.val = val
self.color = color
self.left = None
self.right = None
self.parent = None
class RedBlackTree:
def __init__(self):
self.root = None
def __insert(self, node, val):
if not node:
return RBNode(val, color="BLACK")
if val < node.val:
node.left = self.__insert(node.left, val)
node.left.parent = node
elif val > node.val:
node.right = self.__insert(node.right, val)
node.right.parent = node
if node.color == "RED" and node.parent and node.parent.color == "RED":
if node.parent.parent.left == node.parent:
if node.parent.parent.right and node.parent.parent.right.color == "RED":
node.parent.color = "BLACK"
node.parent.parent.right.color = "BLACK"
node.parent.parent.color = "RED"
else:
if node.parent.right == node:
node = node.parent
self.__left_rotate(node)
node.parent.color = "BLACK"
node.parent.parent.color = "RED"
self.__right_rotate(node.parent.parent)
else:
if node.parent.parent.left and node.parent.parent.left.color == "RED":
node.parent.color = "BLACK"
node.parent.parent.left.color = "BLACK"
node.parent.parent.color = "RED"
else:
if node.parent.left == node:
node = node.parent
self.__right_rotate(node)
node.parent.color = "BLACK"
node.parent.parent.color = "RED"
self.__left_rotate(node.parent.parent)
if not node.parent:
node.color = "BLACK"
return node
def insert(self, val):
self.root = self.__insert(self.root, val)
def __left_rotate(self, node):
y = node.right
node.right = y.left
if y.left:
y.left.parent = node
y.parent = node.parent
if not node.parent:
self.root = y
elif node == node.parent.left:
node.parent.left = y
else:
node.parent.right = y
y.left = node
node.parent = y
def __right_rotate(self, node):
y = node.left
node.left = y.right
if y.right:
y.right.parent = node
y.parent = node.parent
if not node.parent:
self.root = y
elif node == node.parent.right:
node.parent.right = y
else:
node.parent.left = y
y.right = node
node.parent = y
def inorder(self):
self.__inorder(self.root)
def __inorder(self, node):
if not node:
return
self.__inorder(node.left)
print(node.val, node.color)
self.__inorder(node.right)
在这个实现中,我们使用了私有方法__insert来插入节点,并在必要时进行旋转和颜色修改,以保证红黑树的性质。插入操作的时间复杂度为$O(\log n)$。
我们还实现了inorder方法来遍历红黑树。输出的结果可以帮助我们判断红黑树是否正确。
原文地址: https://www.cveoy.top/t/topic/jwA 著作权归作者所有。请勿转载和采集!