1 红黑树(Red-Black Tree)
如果二叉搜索树满足以下红黑属性,则它是红黑树:
- 每个节点不是红色就是黑色。
- 根是黑色的。
- 每片叶子(无)都是黑色的。
- 如果一个节点是红色的,那么它的两个子节点都是黑色的。
- 对于每个节点,从节点到后代叶的所有路径都包含相同数量的黑色节点。
红黑树是许多搜索树方案中的一种,它们是“平衡”的,
以便保证在最坏的情况下,基本的动态设置操作需要O(lg n)时间。
请注意,空叶节点或父节点的颜色为黑色。
更多细节请参见麻省理工学院出版社©2001《算法简介》,第二版,第13章(1180页)
托马斯·H·科尔曼、查尔斯·E·莱瑟森、罗纳德·L·里维斯特和克利福德·斯坦著
ISBN:0262032937
Rudolf Bayer
2 红黑树的算法
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。
红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
3 源程序
using System;
using System.Collections;
using System.Collections.Generic;using Legalsoft.Truffer.TTree;namespace Legalsoft.Truffer.Algorithm
{public class RedBlack_Tree{private BinaryNode root { get; set; } = null;public void Insert(int v){BinaryNode node = new BinaryNode(v);if (root == null){root = node;}else{BinaryNode tempX = root;BinaryNode tempY = null;while (tempX != null){tempY = tempX;tempX = v.CompareTo(tempX.Key) > 0 ? tempX.Right : tempX.Left;}if (v.CompareTo(tempY.Key) >= 0){tempY.Right = node;}else{tempY.Left = node;}}// 修复Insert_Fixup(node);}/// <summary>/// 删除节点。/// 如果节点只有一个子节点或没有子节点,只需将其删除即可。/// 如果节点同时具有左和右子节点,请找到其后续节点,删除它并复制其子节点、/// 要删除的节点的值。/// 删除后,根据定义修复树。/// </summary>/// <param name="node"></param>public void Delete(BinaryNode node){if (node == null){return;}if ((node == root) && (root.Right == null) && (root.Left == null)){root = null;return;}BinaryNode tempX = null;BinaryNode tempY = null;if (node.Left == null || node.Right == null){tempY