以下是一个基本的红黑树实现,包括节点类和红黑树类:

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方法来遍历红黑树。输出的结果可以帮助我们判断红黑树是否正确。

用python语言实现一个红黑树的类

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

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