二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点的值,并且小于其右子树中的任何节点的值。多项选择的BST通常指的是每个节点可以存储多个值或具有多个子节点的特殊BST。
问题:BST在极端情况下(如插入顺序有序的数据)可能会退化成链表,导致性能下降。 原因:不平衡的树结构导致查找、插入和删除操作的时间复杂度退化到O(n)。
class Node:
def __init__(self, key, color='red'):
self.key = key
self.left = None
self.right = None
self.parent = None
self.color = color # 'red' or 'black'
class RedBlackTree:
def __init__(self):
self.NIL = Node(None, 'black')
self.root = self.NIL
def insert(self, key):
new_node = Node(key)
self._insert(new_node)
self._fix_insert(new_node)
def _insert(self, z):
y = self.NIL
x = self.root
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
z.left = self.NIL
z.right = self.NIL
z.color = 'red'
def _fix_insert(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, y):
x = y.left
y.left = x.right
if x.right != self.NIL:
x.right.parent = y
x.parent = y.parent
if y.parent == self.NIL:
self.root = x
elif y == y.parent.right:
y.parent.right = x
else:
y.parent.left = x
x.right = y
y.parent = x
这个示例展示了红黑树的基本插入和平衡操作。通过这种方式,可以有效避免BST退化成链表的问题。
领取专属 10元无门槛券
手把手带您无忧上云