'''
一、红黑树性质
结点必须是红色或者黑色。
根节点必须是黑色。
叶节点(NIL)必须是黑色(NIL节点无数据,是空节点)。
红色结点不能连续。
从任一节点出发到其每个叶子节点的路径,黑色节点的数量必须相等。
'''
from dataStructures.tree.biTree.bst import BST
class RBNode:
def __init__(self, data):
self.elem = data
self.parent = None
self.lchild = None
self.rchild = None
self.color = 'r'
class RBTree(BST):
def __init__(self, li):
BST.__init__(self, li)
def changeColor(self, p, c):
pre_p = p.parent
pre_p.lchild.color = 'b'
pre_p.rchild.color = 'b'
pre_p.color = 'r'
if pre_p == self.root:
p.parent.color = 'b'
return pre_p
def rotate_left_left(self, p, c):
#祖父结点右旋
pre_p = p.parent
rchild_p = p.rchild
p.rchild = pre_p
pre_p.parent = p
pre_p.lchild = rchild_p
if rchild_p:
rchild_p.parent = pre_p
#变色
pre_p.color = 'r'
p.color = 'b'
return p
def rotate_right_right(self, p, c):
#祖父结点左旋
pre_p = p.parent
lchild_p = p.lchild
p.lchild = pre_p
pre_p.parent = p
pre_p.rchild = lchild_p
if lchild_p:
lchild_p.parent = pre_p
#变色
pre_p.color = 'r'
p.color = 'b'
return p
def rotate_left_right(self, p, c):
#父节点左旋
pre_p = p.parent
lchild_c = c.lchild
c.lchild = p
p.parent = c
p.rchild = lchild_c
if lchild_c:
lchild_c.parent = p
c.parent = pre_p
pre_p.lchild = c
#祖父节点右旋
rchild_c = c.rchild
c.rchild = pre_p
pre_p.lchild = rchild_c
pre_p.parent = c
if rchild_c:
rchild_c.parent = pre_p
#变色
c.color = 'b'
pre_p.color = 'r'
return c
def rotate_right_left(self, p, c):
# 父节点右旋
pre_p = p.parent
rchild_c = c.rchild
c.rchild = p
p.parent = c
p.lchild = rchild_c
if rchild_c:
rchild_c.parent = p
c.parent = pre_p
pre_p.rchild = c
#祖父节点左旋
lchild_c = c.lchild
c.lchild = pre_p
pre_p.rchild = lchild_c
pre_p.parent = c
if lchild_c:
lchild_c.parent = pre_p