分析的自己均衡二分木: 赤黒木

分析的自己均衡二分木: 赤黒木

赤黒木の概念

**赤黒木とは?**赤黒木は自己均衡二分木(AVL)で、その名の通り、木を構成するノードは赤か黒のいずれかです
**どんなものですか?**通常の二分木の上に赤黒木があり、ノードの属性として各ノードに色がつけられている、これが赤黒木の性質です
**赤黒木の役割とは木?**典型的な用途は連想配列です. C++ のデータ構造のマップとセットは、赤黒木に基づいて実装されます. キーは値に対応します. キーを介して見つけられる対応する値は、順序付けられたデータを格納するために使用されます、その時間計算量は O(lgn) であり、その効率は非常に高い

赤黒木の性質

自然 1:

节点不是红色就是黑色,这是红黑树的特征,要不叫红黑树

自然 2:

根节点必须为黑色,不能为红色

自然 3:

每个叶子节点(指的是NIL或者空节点的叶子节点)是黑色的

自然 4:

如果一个节点是红色的,那该节点的子节点必须是黑色的

自然 5:

从根节点到叶子节点的所以路径上的黑色节点的数量必须相同

赤黒木の基本操作

1.追加

追加、つまり、新しいノードを赤黒ツリーに挿入します。挿入前の赤黒木はもちろん平衡二分木であり、順序付けられているため、挿入後、新しい赤黒木も平衡二分木になる必要があります。

追加の最初のステップ: 新しいノードの色を赤に設定します

新しいノードを赤に設定する必要があるのはなぜですか? 黒の代わりに?これは、赤黒木の特性の 1 つによるものです: 木のルート ノードから葉ノードまで、パス上の黒いノードの数は同じでなければなりません. 黒の場合、この特性に違反します.ツリーに挿入された後、新しく挿入されたノードは赤くなければなりません

2 番目のステップを追加します。現在のバイナリ ツリーを左手または右手操作とカラーリング操作によってバランスの取れたバイナリ ツリーにします。

新しいノードが挿入された後、最初にバランスが取れているかどうかを確認し、左手または右手を介してバランスのとれた二分木に変わります; 左手: 右のノードが現在のルート ノードとして使用され、ルートはルート ノードとして使用されます
。ノードは、現在のルートである元の右側のノードです ノードの左側のノード、元の右側のノードの左側のノードは、図に示すように、現在の左側のノードの右側のノードです
左利き
。反対に、つまり、左のノードが現在のルート ノードとして使用され、ルート ノードが元の左のノードとして使用されます。つまり、現在のルート ノードの右のノード、元の左のノードの右のノードが使用されます。図に示すように、現在の右ノードの左ノードとして:
右利き
ツリー内のいずれかのノードの左サブツリーと右サブツリーの高さの差が 1 より大きい場合、そのツリーはバランスの取れたバイナリ ツリーではないことを意味します。左右の回転を調整して、バランスの取れた二分木にする必要があります。
次のステップはシェーディングです: このスコアはいくつかのケースを考慮しています:

  1. 挿入されたノードの親ノードが黒の場合、5 つのプロパティに違反していないため、色を付ける必要はありません。
  2. ルート ノードが空の場合は、挿入されたノードがルート ノードであるため、挿入されたノードの色を黒に設定します。
  3. 挿入されたノードの親ノードが赤の場合、
    2 つの状況があります
    1. 挿入されるノードの親ノードの兄弟ノードが赤の場合、たとえば、
    ここに画像の説明を挿入
    このとき、親ノードを黒に変更する必要があります。 、次に右に回転する操作、次に左手で操作して、下の図に示すように、新しい赤黒ツリーを取得します。挿入されたノードは
    ここに画像の説明を挿入
    右側にあり、手順は同じですが、回転の方向は最初は左利き、次に右利きに変わりました。
    2 挿入するノードの親ノードの兄弟ノードが黒の場合、たとえば、
    ここに画像の説明を挿入
    まず親ノードの色を黒に変更し、親ノードの親ノードを赤に変更してから右回転します。
    挿入されたノードが右側にある場合は、右利きから左利きに変更するだけです。

おすすめ

転載: blog.csdn.net/qq_44858592/article/details/108160260