python 红黑树_红黑树增删查python实现

'''

一、红黑树性质

结点必须是红色或者黑色。

根节点必须是黑色。

叶节点(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以回答这个问题,以下是一个简单的 Python 红黑树代码实现: ```python class Node: def __init__(self, key): self.key = key self.left = None self.right = None self.color = 1 class RedBlackTree: def __init__(self): self.null_node = Node(None) self.null_node.color = 0 self.root = self.null_node def rotate_left(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 rotate_right(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 fix_insert(self, z): while z.parent.color == 1: if z.parent == z.parent.parent.right: y = z.parent.parent.left if y.color == 1: y.color = 0 z.parent.color = 0 z.parent.parent.color = 1 z = z.parent.parent else: if z == z.parent.left: z = z.parent self.rotate_right(z) z.parent.color = 0 z.parent.parent.color = 1 self.rotate_left(z.parent.parent) else: y = z.parent.parent.right if y.color == 1: y.color = 0 z.parent.color = 0 z.parent.parent.color = 1 z = z.parent.parent else: if z == z.parent.right: z = z.parent self.rotate_left(z) z.parent.color = 0 z.parent.parent.color = 1 self.rotate_right(z.parent.parent) self.root.color = 0 def insert(self, key): z = Node(key) z.parent = self.null_node z.left = self.null_node z.right = self.null_node z.color = 1 y = None x = self.root while x != self.null_node: y = x if z.key < x.key: x = x.left else: x = x.right z.parent = y if y == None: self.root = z elif z.key < y.key: y.left = z else: y.right = z if z.parent == None: z.color = 0 return if z.parent.parent == None: return self.fix_insert(z) def inorder_helper(self, node): if node != self.null_node: self.inorder_helper(node.left) print(node.key) self.inorder_helper(node.right) def inorder(self): self.inorder_helper(self.root) ``` 希望这个代码实现能够帮助你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值