红黑树

我们把2-3-4树中的四节点表示为由红链接连接起来的三个二节点,把三节点表示为由单一红链接连接起来的两个二节点。三节点中的红链接可以是一个左链接或一个右链接,因此存在两种表示每个三节点的方法。在任何树中,每个节点都被一个链接所指向,所以对链接染色相当于对节点染色。相应地,我们对每个节点利用额外的一位存储指向该节点的链接颜色。我们把这种方式表示的2-3-4树称为红黑二叉搜索树。红黑树中附加的限制条件是:在任何从一个外部链接通向树根的路径上,不存在连续出现的两个红节点。

红黑树有两个核心性质:(1)对二叉搜索树的标准搜索方法无须修改即可运作;(2)它们直接对应2-3-4树。因此我们可以通过保持这种对应关系,实现平衡2-3-4树算法。我们同时得到了两种结构的最佳点:来自标准二叉搜索树的简单搜索方法,以及来自2-3-4搜索树的简单的插入-平衡方法。

搜索方法永远不检查代表节点颜色的域,所以平衡机制不会令基本搜索处理所需的时间增加额外开销。因为在典型应用中每个关键字只插入一次,却可能被搜索许多次,最终结果是我们以相对较低的开销(因为在搜索期间不进行任何平衡工作)获取了得到改善的搜索次数(因为树得到了平衡);而由于我们总是对它们进行分解,在树中存在的四节点不多。插入处理程序的内层循环就是在树中向下推进的代码,其中加入了一个额外的测试:如果一节点有两个红孩子,它就是一个四节点的一部分。这个低开销正是红黑树高效率的主要原因。

现在,让我们来考虑关于两个转换的红黑表示——当我们的确遇到一个四节点时,也许需要执行这两个转换:如果我们有连接到一个四节点的一个二节点,那么我们应该把这对节点转换为连接到两个二节点的一个三节点;如果我们有连接到一个四节点的一个三节点,那么我们应该把这对节点转换为连接到两个二节点的一个四节点。当一个新节点插入到树的底部时,我们把它想象为一个必须分裂的四节点,而它的中间节点被向上传递、插入到搜索终止的底部节点中。

 1 private:
 2     int red(link x)
 3       { if (x == 0) return 0; return x->red;}
 4     void RBinsert(link& h, Item x, int sw)
 5       {
 6          if (h == 0) { h = new node(x); return;}
 7          if (red(h->l) && red(h->r))
 8            { h->red = 1; h->l->red = 0; h->r->red = 0;}
 9          if (x.key() < h->item.key())
10            { RBinsert(h->l, x, 0);
11               if (red(h) && red(h->l) && sw) rotR(h);
12               if (red(h->l) && red(h-l->l))
13                 { rotR(h); h->red = 0; h->r->red = 1;}
14            }
15          else
16            { RBinsert(h->r, x, 1);
17               if (red(h) && red(h->r) && !sw) rotL(h);
18               if (red(h->r) && red(h->r->r))
19                 { rotL(h); h->red = 0; h->l->red = 1;}
20            }
21         }
22 public:
23     void insert(Item x)
24       { RBinsert(head, x, 0); head->red = 0;}

本函数利用红黑表示法实现2-3-4树中的插入操作。我们对类型node加入一个颜色位red,1表明节点为红色,而0表明节点为黑色。在树中向下推进时(在递归调用以前),我们搜索四节点,并通过切换全部三个节点中的颜色位实现对四节点的分裂。当我们达到树的底部时,为将被插入的数据项创建一个新的红节点,并返回一个指向它的指针。在树中向上返回的过程中(在递归调用以后)我们检查是否需要执行一次旋转操作。如果搜索路径上有两个方向相同的红链接,我们从链接上方的节点执行一次单一旋转,然后切换颜色位,以生成一个正确的四节点。如果搜索路径上有两个方向不同的红链接,我们从链接下方的节点执行一次单一旋转,一次简化成另一种情况,留待向上的下一步再处理。

posted @ 2020-05-15 09:43  ~宁静致远~  阅读(161)  评论(0编辑  收藏  举报