红黑树是一颗二叉搜索树,他在每个节点上增加了一个存储位来表示节点的颜色,可以是RED或者是BLACK,树中的每个节点包括5个属性:color、key、left、right、parent,如果一个节点没有子节点或父节点,则该节点的相应指针属性的值为NIL,一颗红黑树是满足下面红黑性质的二叉搜索树。
1.每个节点或是红色的,或是黑色的。
2.根节点是黑色的。
3.每个叶节点(NIL)是黑色的。
4.如果一个节点是红色的,则它的俩个字节点都是黑色的。
5.对每个节点,从该节点到其他所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
一个完整的红黑树的结构图如下:(图片来源于网络,侵删)

红黑树的一般操作包括:红黑树的定义、左旋转、右旋转、红黑树的上色、元素的插入等,具体代码使用Python编写如下:

#定义红黑树
class RBTree(object):def __init__(self):self.nil = RBTreeNode(0)self.root = self.nil
class RBTreeNode(object):def __init__(self, x):self.key = xself.left = Noneself.right = Noneself.parent = Noneself.color = 'black'self.size=None
#左旋转
def LeftRotate( T, x):y = x.rightx.right = y.leftif y.left != T.nil:y.left.parent = xy.parent = x.parentif x.parent == T.nil:T.root = yelif x == x.parent.left:x.parent.left = yelse:x.parent.right = yy.left = xx.parent = y
#右旋转
def RightRotate( T, x):y = x.leftx.left = y.rightif y.right != T.nil:y.right.parent = xy.parent = x.parentif x.parent == T.nil:T.root = yelif x == x.parent.right:x.parent.right = yelse:x.parent.left = yy.right = xx.parent = y
#红黑树的插入
def RBInsert( T, z):y = T.nilx = T.rootwhile x != T.nil:y = xif z.key < x.key:x = x.leftelse:x = x.rightz.parent = yif y == T.nil:T.root = zelif z.key < y.key:y.left = zelse:y.right = zz.left = T.nilz.right = T.nilz.color = 'red'RBInsertFixup(T, z)return z.key, '颜色为', z.color
#红黑树的上色
def RBInsertFixup( T, z):while z.parent.color == 'red':if z.parent == z.parent.parent.left:y = z.parent.parent.rightif y.color == 'red':z.parent.color = 'black'y.color = 'black'z.parent.parent.color = 'red'z = z.parent.parentelse:if z == z.parent.right:z = z.parentLeftRotate(T, z)z.parent.color = 'black'z.parent.parent.color = 'red'RightRotate(T,z.parent.parent)else:y = z.parent.parent.leftif y.color == 'red':z.parent.color = 'black'y.color = 'black'z.parent.parent.color = 'red'z = z.parent.parentelse:if z == z.parent.left:z = z.parentRightRotate(T, z)z.parent.color = 'black'z.parent.parent.color = 'red'LeftRotate(T, z.parent.parent)T.root.color = 'black'
def RBTransplant( T, u, v):if u.parent == T.nil:T.root = velif u == u.parent.left:u.parent.left = velse:u.parent.right = vv.parent = u.parentdef RBDelete(T, z):y = zy_original_color = y.colorif z.left == T.nil:x = z.rightRBTransplant(T, z, z.right)elif z.right == T.nil:x = z.leftRBTransplant(T, z, z.left)else:y = TreeMinimum(z.right)y_original_color = y.colorx = y.rightif y.parent == z:x.parent = yelse:RBTransplant(T, y, y.right)y.right = z.righty.right.parent = yRBTransplant(T, z, y)y.left = z.lefty.left.parent = yy.color = z.colorif y_original_color == 'black':RBDeleteFixup(T, x)
#红黑树的删除
def RBDeleteFixup( T, x):while x != T.root and x.color == 'black':if x == x.parent.left:w = x.parent.rightif w.color == 'red':w.color = 'black'x.parent.color = 'red'LeftRotate(T, x.parent)w = x.parent.rightif w.left.color == 'black' and w.right.color == 'black':w.color = 'red'x = x.parentelse:if w.right.color == 'black':w.left.color = 'black'w.color = 'red'RightRotate(T, w)w = x.parent.rightw.color = x.parent.colorx.parent.color = 'black'w.right.color = 'black'LeftRotate(T, x.parent)x = T.rootelse:w = x.parent.leftif w.color == 'red':w.color = 'black'x.parent.color = 'red'RightRotate(T, x.parent)w = x.parent.leftif w.right.color == 'black' and w.left.color == 'black':w.color = 'red'x = x.parentelse:if w.left.color == 'black':w.right.color = 'black'w.color = 'red'LeftRotate(T, w)w = x.parent.leftw.color = x.parent.colorx.parent.color = 'black'w.left.color = 'black'RightRotate(T, x.parent)x = T.rootx.color = 'black'def TreeMinimum( x):while x.left != T.nil:x = x.leftreturn x
#中序遍历
def Midsort(x):if x!= None:Midsort(x.left)if x.key!=0:print('key:', x.key,'x.parent',x.parent.key)Midsort(x.right)
nodes = [11,2,14,1,7,15,5,8,4]
T = RBTree()
for node in nodes:print('插入数据',RBInsert(T,RBTreeNode(node)))
print('中序遍历')
Midsort(T.root)
RBDelete(T,T.root)
print('中序遍历')
Midsort(T.root)
RBDelete(T,T.root)
print('中序遍历')
Midsort(T.root)

结果如下:



Python实现红黑树相关推荐

  1. Python实现红黑树的删除操作

    Python实现红黑树的删除操作 本专栏的上一篇文章使用Python实现了红黑树的插入操作.参考:https://blog.csdn.net/weixin_43790276/article/detai ...

  2. Python实现红黑树的插入操作

    Python实现红黑树的插入操作 本专栏中的上一篇文章介绍了什么是红黑树,以及红黑树的旋转和变色. 参考:https://blog.csdn.net/weixin_43790276/article/d ...

  3. python:实现红黑树算法(附完整源码)

    python:实现红黑树算法 from __future__ import annotations from collections.abc import Iterator class RedBlac ...

  4. 红黑树的删除_Python实现红黑树的删除操作

    上一篇文章使用Python实现了红黑树的插入操作.参考:Python实现红黑树的插入操作本篇文章使用Python实现红黑树的删除操作.先将红黑树的5条特性列出来:1. 节点是红色或黑色.2. 根节点是 ...

  5. 数据结构之平衡树:红黑树的介绍与Python代码实现——17

    红黑树的介绍与Python代码实现 红黑树的介绍 红黑树(Red-Black Tree)是一种平衡二叉查找树,它是一种以比较简单的方式实现的2-3查找树 红黑树基于2-3查找树的表现 红链接:将两个2 ...

  6. python 红黑树_python学习笔记|红黑树(性质与插入)

    定义 一种含有红黑节点并能自平衡的二叉查找树(BST) 性质 1.每个节点有红/黑标记位 2.根节点是黑色(硬性规定) 3.每个叶子节点(NIL)都是黑色的虚节点(由此引出性质5) 叶子节点 colo ...

  7. python【数据结构与算法】红黑树概念辨析

    文章目录 1 二叉查找树 2 AVL 3 红黑树 1 二叉查找树 二叉查找树,Binary Search Tree 「BST」,要想了解二叉查找树,我们首先看下二叉查找树有哪些特性呢? 某节点的左子树 ...

  8. 算法导论 第十三章 红黑树(python)-1插入

    红黑树是上一章二叉搜索树的改进,实现一种平衡 ,保证不会出现二叉树变链表的情况,基本动态集合操作的时间复杂度为O(lgn) 实际用途:c++stl中的set,map是用他实现的 红黑树的性质: 1.每 ...

  9. 4岁的儿子还不会写红黑树,我该怎么办?

    程序员书库(ID:OpenSourceTop) 编译 书单来自:https://www.codemom.ai/best-coding-books-for-kids/ 身为一名程序员,很多人肯定会认为程 ...

最新文章

  1. Texlive安装与环境变量配置
  2. 单片机机器周期怎么计算公式_什么是晶振,对于单片机来说它有什么重要作用?...
  3. 十分钟轻松让你认识Entity Framework 7
  4. 高效CSS的一些建议
  5. xgboost调参指南
  6. 【专题】多角度深入解析开放原子开源基金会
  7. SpringBoot时间戳与MySql数据库记录相差14小时排错
  8. Java高级语法笔记-匿名类(Anonymous Class)
  9. 玩个锤子,李飞飞夫妇团队的最新研究
  10. python基础学习-字符串
  11. 检测多边形是否重叠_只要保留定位感知通道,目标检测模型也能剪枝70%参数
  12. VBS - 空变量判断详解
  13. MySQL(16)-----字符串函数
  14. 必须掌握,二叉树的前中后序遍历(迭代+递归)详细代码
  15. php slim 教程,php框架slim架构上存在XXE漏洞(XXE的典型存在形式)
  16. vue生成证书模板 并支持图片和PDF格式下载的小demo
  17. 33.Redis详解
  18. 次氯酸钠发生器选型依据,再也不怕选不对设备了
  19. 如何访问同一局域网内的其他电脑文件
  20. 杰理ac18芯片_杰理科技推出:「梧桐」系列双模音视频 AIoT 芯片

热门文章

  1. 搭建nlp_server服务器
  2. 2017年清华大学计算机科学与技术系考研小结
  3. 伦敦大学研究:新的长寿机制,延长端粒,阻止衰老
  4. 矩阵的三角分解(LU分解)
  5. .xin 域名信用验证问题集锦
  6. 一款不愿透露姓名的绿色小说软件
  7. Apache Dubbo基本使用
  8. 脱离文档流和半脱离文档流(详解)
  9. 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)
  10. 关于生产环境跨域问题