在学习红黑树之前,最好已经学习过AVL树了,因为二者的实现方式是有很大程度类似的(左旋和右旋),但是只不过二叉平衡树是在每次加入节点时,需要计算该节点的左右子树高度差,如果高度差大于一则旋转调节使其平衡;而红黑树是在每次加入节点时计算红黑节点之间的关系,如果关系错误,则通过旋转和改变颜色来调节树的结构。
总之,AVL树也好,RB树也好,都只不过是一种优化二叉查找树的高级方式而已。
下面是C#实现的红黑树插入操作,并附加了详细的注释,如果你了解红黑树的原理,应该很容易看懂,最后通过优雅的层序遍历将节点值和节点颜色输出出来。并且利用一个国外一个有名的红黑树网站生成了树的结构,验证了代码的正确性。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RBTree
{
class Program
{
static void Main(string[] args)
{
int[] a = { 11, 2, 14, 1, 7, 15, 5, 8 };
RBTree rbTree = new RBTree();
foreach (var item in a)
{
rbTree.Insert(item);
}
rbTree.LayerOrder(rbTree.rootnode);
rbTree.Insert(4);
Console.WriteLine();
Console.WriteLine();
rbTree.LayerOrder(rbTree.rootnode);
Console.WriteLine();
Console.WriteLine();
}
}
public enum Color
{
red,black
}
class RBTreeNode
{
public int key;
public RBTreeNode left;
public RBTreeNode right;
public Color color;
//由于红黑树需要寻找父节点和祖父节点以及叔节点
//因而需要多设置一个parent节点来方便操作
public RBTreeNode parent;
public RBTreeNode(int item,Color color)
{
key = item;
left = null;
right = null;
this.color = color;
}
public override string ToString()
{
//重写tostring()方法,在输出时会默认调用
return key + "(" + color.ToString() + ")";
}
}
class RBTree
{
//定义根节点
public RBTreeNode rootnode;
public void Insert(int item)
{
if(rootnode =