はじめての C

二分木 続き 5

つりあいの とれた 二分木には、代表的なものが 3つ あります。

はじめの 2つは、この tutorial で 扱うことになる spray木と AVL木です。

もう 1つの red-black木ですが、この tutorial では、簡単な 説明だけに しておきます。 でも 多分 将来の tutorial では、より 完全なものが できるでしょうね。

red-black木とは、(二分木とは) 別の 木の タイプで 2-3-4木と 呼ばれるものの、二分形式での 表記のことです。

2-3-4木では、root が すでに リンクを 2つ もつときに 3つ目の リンクを 追加し、別の リンクを 追加して 合計 4つに するために 分割を 行うことで、その 最小の高さ - minimal height - が 保たれています。

M が 挿入されると、次のような (Knuth 3, 6.2.3) 分割が 実行されます ▽


       J
   /         |
   E        L,T
 /   |   /   |     |          
A,C  G  K  M,N,R  V,X


       J
   /        |
   E      L,N,T
 /   |  /  |  |   | 
A,C, G  K  M  R  V,X 


        J,N
   /     |      | 
   E     L      T 
 /   |  /  |  /   | 
A,C  G  K  M  R  V,X

二分木だと、リンクを 追加すると いうような ゼイタクは できませんから、red-black木では 2-3-4 という 構成を 表すために カラー表記を 使っています (red が 内部リンク、black は 外部リンクに)。

red-black の 構造体に おいては、ノードが 3つ あるのと 同じことを、次のように 表します ▽


3 Node  Red-black Node (R = red link color)
  *      R  R  
/ | |   / or |
       *      *

ノードが 4つの ときは、次のように なります ▽


4 Node  Red-black Node (R = red link color)
   *       R
/ | | |   / |
         *   *

red-black の 図式は 全体として とても エレガントで、AVL木との 違いは 通常 その入力データに よっています。

この tutorial で、red-black ではなくて AVL の方を 選んだのは、まったくの 独断に よるものです。