プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

データ構造の赤黒木への挿入


赤黒木は、ツリーの各ノードが赤または黒で色付けされた平衡二分探索木です。赤黒木で実行できる操作には、検索、挿入、削除の3種類があります。

次の赤黒木に要素を挿入する必要があるとしましょう。

データ構造の赤黒木への挿入

赤黒木に要素を挿入する方法は非常に簡単です。通常の二分木に挿入するのと同じように挿入を実行します。ルートノードから開始して、ノードの色を確認し、特定の位置に挿入します。ただし、赤黒木では、要素を挿入するための追加の手順が必要です。

ただし、条件に従うと、赤黒木はバランスが取れていることを知っておく必要があります-

  • すべてのルートノードは黒である必要があります。

  • すべてのノードは赤または黒です。

  • ノードが赤の場合、その子は黒である必要があります。

  • ルートからエンドまでのパスには、同数のブラックノードが含まれている必要があります。

赤黒木に新しいノードを挿入する場合は、挿入手順を確認することで挿入できます。

赤黒木に要素を挿入する手順-

  • ツリーが空かどうかを確認します。ツリーが空の場合は、新しいノードを挿入し、それを黒に色付けします。 (ルートノードの色は常に黒である必要があるため)」

  • それ以外の場合、ツリーが空でない場合は、新しいノードをリーフノードとして最後まで挿入し、赤で色付けします。

  • 新しいノードの親が赤で、その隣接(親)ノードも赤の場合、隣接ノードと親および祖父母の両方の色を反転します(ルートノードでない場合は、親と隣接ノードの色のみを反転します)。 、黒。

  • 新しいノードの親が赤で、その隣接する(親の)ノードが空またはNULLの場合、新しいノードと親を回転(左左または左右回転)します。

適用される回転には、左左回転と左右回転の2種類があります。ローテーションは、一部の条件でのみ適用されます。条件は-

  • 新しいノードの親が赤で、隣接ノードが空またはNULLの場合は、左または右に回転します。

  • 左左回転で、親と祖父母の色を反転します。親を祖父母、祖父母を子にします。

データ構造の赤黒木への挿入


データ構造の赤黒木への挿入

アルゴリズム

RBTreeInsertion(root、key)

//The color of the inserted new node is Red
color[key] <- Red
while(key≠root and color (p[key]=Red))
do if p[key]= left(p[p[key]])
   Then y←right[p[p[key]]
// If the parent of the new node is Red(if there is Grandparent instead
root Node) Flip the color.
   if color[y]← Red
   then color(p[key])← Black
      color(p[p[key]])← Red
      key← p[p[key]]
   else if key← right[p[key]]
      then key← p[key]
      //When parent of new node has the red color and its sibling is NULL
   LeftRotate(root,key)
   color(p[key]) ← Black
   color(p[p[key]]) ← Red
RotateRight(root,p[p[key]])
else exchange then left and right elements to make it balance.
color(root)← Black

  1. データ構造における二分木ADT

    基本概念 二分木は、ノードが3つを超える子を持つことができないツリーとして定義されます。ノードの最高次数は2です。これは、二分木の次数が0または1または2であることを示しています。 上の図では、二分木はルートと2つのサブツリーTreeLeftとTreeRightで構成されています。二分木の左側にあるすべてのノードは左側のサブツリーと呼ばれ、二分木の右側にあるすべてのノードは右側のサブツリーと呼ばれます。 実装 二分木には最大2つの子があります。それらに直接ポインタを割り当てることができます。ツリーノードの宣言は、ノードがキー情報に加えて他のノードへの2つのポインタ(左と右)を含む構

  2. データ構造の仮想ツリーでのスプレー

    仮想ツリーでは、一部のエッジは実線として扱われ、一部は破線として扱われます。通常のスプレイは、堅い木でのみ実行されます。仮想ツリーのノードyで表示するには、次の方法を実装します。 アルゴリズムは、パスごとに1回ずつ、ツリーを3回調べ、それを変更します。最初のパスでは、ノードyから開始して、ソリッドツリーのみでスプレイすることにより、yからツリー全体のルートへのパスが破線になります。このパスは、スプライシングによって確実に作成されます。ノードyでの最後のスプレイにより、yがツリーのルートになります。非公式ではありませんが、アルゴリズムは次のように説明されています Splay(y)のアルゴリズ