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

C / C ++の2-3ツリー(検索と挿入)?


2-3ツリーは、ツリーデータ構造として定義され、子を持つすべてのノード(内部ノード)には、2つの子(2ノード)と1つのデータ要素、または3つの子(3ノード)と2つのデータがあります。要素。

C / C ++の2-3ツリー(検索と挿入)?

定義

1つのデータ要素と2つの子がある場合、内部ノードは2ノードと呼ばれます。

2つのデータ要素と3つの子がある場合、内部ノードは3ノードと呼ばれます。

次のステートメントのいずれかが満たされる場合に限り、Tは2-3ツリーと呼ばれます-

  • Tは空または空です。つまり、Tにはノードが含まれていません。

  • Tは、データ要素aを備えた2ノードです。 Tが子Lと右子Rを残した場合、次のように結論付けます

  • LとRは、同じ高さの空でない2〜3本の木として扱われます。

  • aはLの各要素よりも高いです。および

  • aはRの各データ要素以下です。

  • Tは、データ要素aとbを持つ3ノードであり、aはb未満です。 Tが子L、中間の子M、および右の子Rを残した場合、結論を出します

  • L、M、およびRは、同じ高さの空でない2〜3本の木として扱われます。

  • aは、Lの各データ要素よりも高く、Mの各データ要素以下です。および

  • bは、Mの各データ要素よりも高く、Rの各データ要素以下です。

プロパティ

  • すべての内部ノードは、2ノードまたは3ノードとして扱われます。

  • すべての葉は同じレベルにあります。

  • すべてのデータは、並べ替えられた順序で維持または保持されます。

操作

検索

2-3ツリーでアイテムを検索することは、バイナリ検索ツリーでアイテムを検索することと同じです。各ノードのデータ要素は順序付けられたものとして扱われるため、検索機能は正しいサブツリーに転送され、最終的にはアイテムで構成される正しいノードに転送されます。

  • Tを2〜3ツリーとして扱い、dを検索するデータ要素とします。 Tが空の場合、dはTに含まれておらず、実行されます。

  • rをTのルートとして扱います。

  • rを葉とします。 dがrにない場合、結果としてdはTにありません。それ以外の場合、dはTにあります。特に、dはリーフノードで見つけることができます。これ以上の手順は必要なく、実行されます。

  • rが左の子Lと右の子Rを持つ2ノードとして扱われると仮定します。eをrのデータ要素として扱うとします。

3つのケースがあります-

  • dがeと等しい場合、Tでdが見つかり、実行されます。

  • dがeより小さい場合は、TをLに設定します。これは定義上2-3ツリーであり、手順2に戻ります。

  • dがeより大きい場合は、TをRに設定し、手順2に戻ります。

  • rを、左の子L、中央の子M、および右の子Rを持つ3ノードとします。aとbをrの2つのデータ要素として扱います。ここで、a

    • dがaまたはbに等しい場合、dはTにあり、実行されます。

    • dがaより小さい場合は、TをLに設定し、手順2に戻ります。

    • aがd未満で、dがb未満の場合は、TをMに設定して、手順2に戻ります。

    • dがbより大きい場合は、TをRに設定し、手順2に戻ります。

挿入

挿入は、キーの適切な場所を検索し、そこに追加または追加することによって実行されます。ノードが4ノードになると、ノードは2つの2ノードに分割され、真ん中のキーが親に移動します。その後、親は4ノードになる可能性があります。その場合、親も分割され、キーを自身の親に伝播します。このプロセスは、2ノードで分割する必要のない親に到達するまで、またはルートに到達するまで繰り返されます。ルートに到達すると、伝播された要素を実装して、2ノードである新しいルートを作成します。 。このアルゴリズムの助けを借りて、実行する操作の数はツリーの高さに比例します。したがって、ツリーは完全にバランスが取れているため、対数になります。このプロセスにより、結果が2〜3の木として扱われるようになります。特に、すべての葉が同じ深さに残ります。

次の図は、このプロセスの考えられるケースを説明または示しています。

C / C ++の2-3ツリー(検索と挿入)?


考えられる3つのケースの2〜3ツリーへの数値の挿入。


  1. C++のユニークな二分探索木

    整数nがあるとすると、1からnまでの値を格納する構造的に一意のすべての二分探索木を数える必要があります。したがって、入力が3の場合、ツリーは– になるため、出力は5になります。 これを解決するには、次の手順に従います– サイズn+1の配列を1つ作成します dp [0]:=1 for i:=1からn for j:=0 to i – 1 dp [i]:=dp [i] +(dp [i – 1 – j] * dp [j]) return dp [n] 例(C ++) 理解を深めるために、次の実装を見てみましょう- #include <bits/stdc++.h

  2. C++でのユニークな二分探索木II

    整数nがあるとすると、1からnまでの値を格納する構造的に一意のすべての二分探索木を生成する必要があります。したがって、入力が3の場合、ツリーは-になります。 これを解決するには、次の手順に従います- generate()と呼ばれる1つの再帰関数を定義します。これには、低くても高くてもかまいません。 tempと呼ばれる1つのツリーノードを定義します。 高い場合は、一時にnullを挿入し、一時を返します 低から高の範囲のiの場合 left_subtree:=generate(low、i – 1) right_subtree:=generate(i + 1、high) 現在:=i