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

データ構造入門:スレッド二分木(Threaded Binary Tree)の仕組みと種類を解説

スレッド二分木(Threaded Binary Tree)とは

本記事では、データ構造の一つである「スレッド二分木」について詳しく解説します。二分木の各ノードは最大で2つの子を持ちますが、子が1つしかない場合、あるいは1つも存在しない場合、連結リスト表現ではそのリンク部分がnull(空)のまま残され、メモリが無駄になってしまいます。スレッド二分木では、この未使用のリンク領域を「スレッド(糸)」として再利用することで、メモリを有効活用しつつ効率的な巡回を可能にしています。

スレッド二分木の種類

スレッド二分木には、大きく分けて「単一スレッド二分木」と「完全スレッド二分木」の2種類があります。さらに単一スレッド方式には、「左スレッド型」と「右スレッド型」という2つのバリエーションが存在します。

左スレッド型と右スレッド型の動作

左スレッド型では、あるノードに左の子が存在しない場合、その左ポインタは中間順巡回(inorder traversal)における先行ノード(inorder predecessor)を指すように設定されます。同様に、右スレッド型では、右の子を持たないノードの右ポインタは、中間順巡回における後続ノード(inorder successor)を指します。そして、いずれの場合も対応する先行ノードや後続ノードが存在しないときは、ヘッダーノードを指すことになります。

以下は、左スレッド型および右スレッド型の木の例です。

データ構造入門:スレッド二分木(Threaded Binary Tree)の仕組みと種類を解説

データ構造入門:スレッド二分木(Threaded Binary Tree)の仕組みと種類を解説

完全スレッド二分木のノード構造

完全スレッド二分木では、各ノードが合計5つのフィールドを持つ点が特徴です。通常の二分木ノードと同じ3つのフィールド(左リンク・データ・右リンク)に加えて、その側のリンクが実際の子ノードへのリンクなのか、それともスレッドなのかを判別するためのブール値(真偽値)フラグが2つ追加されています。

左スレッドフラグ左リンクデータ右リンク右スレッドフラグ

次の図は、完全スレッド二分木の構造を示したものです。

データ構造入門:スレッド二分木(Threaded Binary Tree)の仕組みと種類を解説

このようにスレッドを活用することで、スタックを使用せずに中間順巡回を実行できるなど、メモリの有効利用と処理効率の向上という大きなメリットが得られます。

  1. データ構造の範囲ツリー(レンジツリー)とは?仕組み・kd-treeとの違い・構築方法を解説

    範囲ツリー(range tree)は、点の集合を格納するための順序付き木構造として定義されるデータ構造です。最大の特徴は、指定された範囲内に存在するすべての点を効率的に取得できる点にあり、実務では主に2次元以上の空間で実装されます。範囲ツリーはkd-tree(kd木)とよく似た構造を持っていますが、両者には明確なトレードオフがあります。範囲ツリーはクエリ時間が O(logd n + k) とkd-treeより高速である一方、必要な記憶領域は O(n logd-1 n) と大きくなります。ここで、d は空間の次元数、n は木に格納されている点の総数、k は1回のクエリで取得される点の数を表します

  2. 二分木(バイナリツリー)のデータ構造と重要な性質を解説

    二分木(バイナリツリー)とは、各ノードが持てる子ノードの数を最大2つに制限した木構造のデータ構造です。本記事では、この二分木が持つ重要な性質について、具体例とともにわかりやすく解説します。まず、次のような二分木を例に考えてみましょう。二分木の主な性質各レベルの最大ノード数:レベル「l」における最大ノード数は 2l−1 です。ここでいうレベルとは、根(ルート)からそのノードまでの経路上にあるノードの総数を指し、ルート自身も含みます。なお、ルートのレベルは1として扱います。木全体の最大ノード数:高さ h の二分木に含まれる最大ノード数は 2h−1 です。ここでいう高さとは、ルートから葉までの経路上