红黑树算法详解:Python 代码实现及注释
红黑树算法详解:Python 代码实现及注释
红黑树是一种自平衡的二叉搜索树,它保证了在最坏情况下基本动态集合操作的时间复杂度为 O(log n)。
下面是一个带注释的红黑树算法:
# 红黑树节点类
class Node:
def __init__(self, key):
self.key = key
self.parent = None
self.left = None
self.right = None
self.color = 1 # 红色为1,黑色为0
# 红黑树类
class RedBlackTree:
def __init__(self):
self.null_node = Node(None) # 定义一个空节点
self.null_node.color = 0 # 空节点为黑色
self.root = self.null_node # 根节点默认为 null_node
# 左旋
def left_rotate(self, x):
y = x.right
x.right = y.left
if y.left != self.null_node:
y.left.parent = x
y.parent = x.parent
if x.parent == self.null_node:
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.null_node:
y.right.parent = x
y.parent = x.parent
if x.parent == self.null_node:
self.root = y
elif x == x.parent.right:
x.parent.right = y
else:
x.parent.left = y
y.right = x
x.parent = y
# 插入节点
def insert(self, key):
new_node = Node(key)
new_node.parent = self.null_node
new_node.left = self.null_node
new_node.right = self.null_node
new_node.color = 1
y = None
x = self.root
while x != self.null_node:
y = x
if new_node.key < x.key:
x = x.left
else:
x = x.right
new_node.parent = y
if y == None:
self.root = new_node
elif new_node.key < y.key:
y.left = new_node
else:
y.right = new_node
if new_node.parent == None:
new_node.color = 0
return
if new_node.parent.parent == None:
return
self.fix_insert(new_node)
# 插入后调整
def fix_insert(self, new_node):
while new_node.parent.color == 1:
if new_node.parent == new_node.parent.parent.right:
u = new_node.parent.parent.left
if u.color == 1:
# case 1
u.color = 0
new_node.parent.color = 0
new_node.parent.parent.color = 1
new_node = new_node.parent.parent
else:
if new_node == new_node.parent.left:
# case 2
new_node = new_node.parent
self.right_rotate(new_node)
# case 3
new_node.parent.color = 0
new_node.parent.parent.color = 1
self.left_rotate(new_node.parent.parent)
else:
u = new_node.parent.parent.right
if u.color == 1:
# case 1
u.color = 0
new_node.parent.color = 0
new_node.parent.parent.color = 1
new_node = new_node.parent.parent
else:
if new_node == new_node.parent.right:
# case 2
new_node = new_node.parent
self.left_rotate(new_node)
# case 3
new_node.parent.color = 0
new_node.parent.parent.color = 1
self.right_rotate(new_node.parent.parent)
if new_node == self.root:
break
self.root.color = 0
# 中序遍历
def inorder_traversal(self, root):
if root != self.null_node:
self.inorder_traversal(root.left)
print(root.key, end=" ")
self.inorder_traversal(root.right)
# 测试
rbt = RedBlackTree()
rbt.insert(10)
rbt.insert(20)
rbt.insert(30)
rbt.insert(100)
rbt.insert(90)
rbt.insert(40)
print("红黑树中序遍历结果:")
rbt.inorder_traversal(rbt.root)
注释中详细解释了每个函数的作用和流程,希望对你有帮助。
原文地址: https://www.cveoy.top/t/topic/osh0 著作权归作者所有。请勿转载和采集!