红黑树算法详解: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)

注释中详细解释了每个函数的作用和流程,希望对你有帮助。

红黑树算法详解:Python 代码实现及注释

原文地址: https://www.cveoy.top/t/topic/osh0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录