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

木構造の左子・右兄弟表現(Left-Child Right-Sibling)とは?仕組みとメリット・デメリットを解説

左子・右兄弟表現とは

左子・右兄弟表現は、n分木(n-ary tree)を表現するためのもうひとつのデータ構造です。従来の方法では、ノードはすべての子ノードへのポインタを個別に保持していましたが、この表現では各ノードが持つポインタはわずか2つだけです。

  • 最初の子へのポインタ(左子:Left Child)
  • 直後の兄弟へのポインタ(右兄弟:Right Sibling)

この変換により、ノードが持つ子の数をあらかじめ知っておく必要がなくなるだけでなく、ポインタの数も最大2つに抑えられるため、実装が格段にシンプルになります。

表現のルール

  • 同じ親を持つ子ノード同士を、左から右へ順に連結する。
  • 親ノードは、最初の子ノードにのみリンクする。

具体例

以下は、左子・右兄弟表現による木構造の一例です。

10
|
2 -> 3 -> 4 -> 5
|              |
6              7 -> 8 -> 9

この図では、ノード10が最初の子として2を持ち、2・3・4・5が兄弟として左から右へ連結されています。さらに、ノード2の子は6、ノード5の子は7・8・9という階層構造になっています。実際の親子関係は「10 → {2, 3, 4, 5}」「2 → {6}」「5 → {7, 8, 9}」となります。

メリット

  • ノードごとのポインタ数が最大2つに制限されるため、メモリを節約できる
  • 子の数が事前に不明でも対応でき、柔軟な木構造を表現できる。
  • 実装がシンプルになり、コーディングが容易になる。

デメリット

  • 検索・挿入・削除といった基本操作に時間がかかる場合がある。目的の位置を特定するには、対象ノードのすべての兄弟を順番にたどる必要があるためである(最悪の場合、兄弟全体を走査することになる)。

まとめ

左子・右兄弟表現は、ポインタを2つに絞ることでメモリ効率と実装のしやすさを実現した、n分木の代表的な表現方法です。一方で、要素へのアクセスには兄弟の走査が必要となるため、操作速度を重視する場面では注意が必要です。用途に応じて通常の配列ベース表現や他の木構造との使い分けを検討するとよいでしょう。

  1. 二分探索木の走査アルゴリズム完全解説:行順・先行順・後行順・レベル順をC++で実装

    二分探索木の走査とはこの記事では、二分探索木(BST:Binary Search Tree)に格納されたキーを巡回するための4種類の走査アルゴリズムを解説します。具体的には、以下の4つです。行順(Inorder)走査:左部分木 → 根 → 右部分木の順に訪問先行順(Preorder)走査:根 → 左部分木 → 右部分木の順に訪問後行順(Postorder)走査:左部分木 → 右部分木 → 根の順に訪問レベル順(Level-order)走査:木の上から階層ごとに左から右へ訪問例として使用する木説明のために、次のような二分探索木を想定します。この木に対する各走査の結果は以下のようになります。行順走

  2. データ構造における二分木の表現方法|配列と連結リストの違いを解説

    コンピュータメモリ上での二分木の表現方法 ここでは、二分木をコンピュータのメモリ上でどのように表現するかについて解説します。表現方法には主に2種類あり、配列を使う方法と連結リスト(リンクリスト)を使う方法があります。 配列による表現 まず、次のような二分木を例に考えてみましょう。 配列による表現では、木の要素をレベル順(幅優先順)に走査しながら格納していきます。つまり、ノードを上のレベルから順番に保存する方式です。存在しない要素がある場合は、その位置を空白のまま残します。上記の木を配列で表現すると、次のようになります。 123456789101112131415 10516-81520