数据结构之红黑树

张开发
2026/4/18 22:39:38 15 分钟阅读

分享文章

数据结构之红黑树
红黑树Red-Black Tree详解目录引言红黑树的基本概念红黑树的性质红黑树的操作旋转操作插入操作删除操作时间复杂度分析应用场景红黑树与其他平衡二叉搜索树的比较代码实现示例总结引言红黑树是一种自平衡的二叉搜索树由Rudolf Bayer在1972年发明。它通过在二叉搜索树的基础上增加额外的信息节点的颜色和约束条件确保树的高度保持在O(log n)级别从而保证基本操作的高效性。红黑树是许多实际应用中广泛使用的平衡二叉搜索树包括Java的TreeMap、C的std::map、Linux内核的 Completely Fair Scheduler (CFS) 等。红黑树的基本概念节点结构红黑树的每个节点包含以下信息键值Key左子节点Left Child右子节点Right Child父节点Parent节点颜色Color红色或黑色颜色表示红色Red表示该节点是红色的黑色Black表示该节点是黑色的根节点和叶子节点根节点必须是黑色的所有叶子节点NIL节点即空节点都是黑色的红黑树的性质红黑树必须满足以下五个性质性质1每个节点要么是红色要么是黑色。性质2根节点是黑色的。性质3每个叶子节点NIL节点是黑色的。性质4如果一个节点是红色的则它的两个子节点都是黑色的红色节点不能有红色子节点。性质5从任意节点到其每个叶子节点的所有路径都包含相同数量的黑色节点。这些性质确保了红黑树的高度不会超过2log(n1)从而保证了操作的时间复杂度为O(log n)。红黑树的操作旋转操作旋转是红黑树维护平衡的核心操作分为左旋和右旋左旋Left Rotationx y / \ / \ T1 y -- x T3 / \ / \ T2 T3 T1 T2右旋Right Rotationy x / \ / \ x T3 -- T1 y / \ / \ T1 T2 T2 T3旋转操作的时间复杂度为O(1)。插入操作插入操作分为以下几个步骤标准BST插入将新节点作为叶子节点插入到二叉搜索树中新节点颜色为红色。修复红黑树性质通过一系列旋转和重新着色操作恢复红黑树的性质。插入操作的时间复杂度为O(log n)。插入后的修复插入后可能违反红黑树的性质需要根据不同情况进行修复情况1父节点是黑色无需修复情况2父节点是红色叔叔节点是红色情况3父节点是红色叔叔节点是黑色且新节点是父节点的右孩子情况4父节点是红色叔叔节点是黑色且新节点是父节点的左孩子删除操作删除操作比插入操作更复杂分为以下几个步骤标准BST删除删除节点可能产生一个替代节点修复红黑树性质通过一系列旋转和重新着色操作恢复红黑树的性质删除操作的时间复杂度为O(log n)。删除后的修复删除后可能违反红黑树的性质需要根据不同情况进行修复情况1兄弟节点是红色情况2兄弟节点是黑色且兄弟的两个子节点都是黑色情况3兄弟节点是黑色且兄弟的左子节点是红色右子节点是黑色情况4兄弟节点是黑色且兄弟的右子节点是红色时间复杂度分析操作时间复杂度查找O(log n)插入O(log n)删除O(log n)最小值/最大值O(log n)前驱/后继O(log n)应用场景红黑树在许多实际应用中被广泛使用关联数组/映射如Java的TreeMap、C的std::map文件系统如Linux的ext2/ext3文件系统网络路由表如IP路由表操作系统调度器如Linux的CFS调度器红黑树与其他平衡二叉搜索树的比较特性红黑树AVL树Splay树平衡条件近似平衡严格平衡自适应平衡插入/删除O(log n)O(log n)O(log n)均摊查找O(log n)O(log n)O(log n)均摊旋转次数少多依赖于访问模式空间开销每个节点1位每个节点2位每个节点2位适用场景频繁插入删除频繁查找频繁访问的热点数据代码实现示例以下是一个简化的红黑树实现PythonclassNode:def__init__(self,key,colorred,leftNone,rightNone,parentNone):self.keykey self.colorcolor# red or blackself.leftleft self.rightright self.parentparentclassRedBlackTree:def__init__(self):self.NILNode(None,black)# Sentinel nodeself.rootself.NIL# 插入操作definsert(self,key):new_nodeNode(key,red,self.NIL,self.NIL,self.NIL)self._insert(new_node)def_insert(self,z):yself.NIL xself.rootwhilex!self.NIL:yxifz.keyx.key:xx.leftelse:xx.right z.parentyifyself.NIL:self.rootzelifz.keyy.key:y.leftzelse:y.rightz z.leftself.NIL z.rightself.NIL z.colorredself._insert_fixup(z)def_insert_fixup(self,z):whilez.parent.colorred:ifz.parentz.parent.parent.left:yz.parent.parent.rightify.colorred:z.parent.colorblacky.colorblackz.parent.parent.colorredzz.parent.parentelse:ifzz.parent.right:zz.parent self._left_rotate(z)z.parent.colorblackz.parent.parent.colorredself._right_rotate(z.parent.parent)else:yz.parent.parent.leftify.colorred:z.parent.colorblacky.colorblackz.parent.parent.colorredzz.parent.parentelse:ifzz.parent.left:zz.parent self._right_rotate(z)z.parent.colorblackz.parent.parent.colorredself._left_rotate(z.parent.parent)self.root.colorblack# 旋转操作def_left_rotate(self,x):yx.right x.righty.leftify.left!self.NIL:y.left.parentx y.parentx.parentifx.parentself.NIL:self.rootyelifxx.parent.left:x.parent.leftyelse:x.parent.righty y.leftx x.parentydef_right_rotate(self,y):xy.left y.leftx.rightifx.right!self.NIL:x.right.parenty x.parenty.parentify.parentself.NIL:self.rootxelifyy.parent.right:y.parent.rightxelse:y.parent.leftx x.righty y.parentx# 其他操作查找、删除等...总结红黑树是一种高效的自平衡二叉搜索树通过颜色标记和旋转操作确保树的高度保持在O(log n)级别。它的插入和删除操作的时间复杂度均为O(log n)适用于需要频繁插入、删除和查找的场景。红黑树的主要优势在于插入和删除操作比AVL树更高效旋转操作次数较少空间开销较小适用于大多数实际应用场景虽然红黑树的实现相对复杂但其优秀的性能和广泛的应用使其成为计算机科学中最重要的数据结构之一。

更多文章