|
Article on other languages:
|
木構造(きこうぞう)とは、グラフ理論の木の構造をしたデータ構造のこと。
ノード木構造は、ノード(節点、頂点)とノード間を結ぶエッジ(枝、辺)あるいはリンクで表される。ノードには何らかのデータ(値、条件、別のデータ構造、別の木構造)が付属している。木構造内の各ノードは、0個以上の子ノード(child nodes)を持ち、子ノードは木構造内では下方に存在する(木構造の成長方向は下とするのが一般的である)。子ノードを持つノードは、子ノードから見れば親ノード(parent node)である。同じ親を持つノード同士を兄弟という。ノードは高々1つの親ノードを持つ。最底辺の子ノードから、あるノードまでのエッジ数を、そのノードの「高さ」という。(後述する)根ノードの「高さ」は、木構造の「高さ」である。逆に根ノードから最底辺に向かってのエッジ数を「深さ」という。 根ノード木構造の頂点にあるノードを根ノード(root node)と呼ぶ。頂点にあるため、根ノードは親ノードを持たない。木構造に対する各種操作は、一般に根ノードを出発点とする(アルゴリズムによっては、葉ノードから開始して根ノードに到達して完了するものもある)。他のノードにはエッジあるいはリンクを辿ることで必ず到達できる。形式的定義では、そのような(根から特定ノードまでの)経路は常に一意である。図で示す場合、根ノードが一番上に描かれるのが普通である。ヒープなどの木構造では、根ノードは特別な属性を持つ。木構造内の全てのノードは、そのノードを頂点とする部分木の根ノードと見なすことができる。 葉ノード木構造の最底辺にあるノードを葉ノード(leaf node)と呼ぶ。最底辺にあるため、葉ノードは子ノードを持たない。 内部ノード内部ノード(internal node、inner node)は、子ノードを持つノード、すなわち葉ノード以外のノードを意味する。 部分木部分木(subtree)は、木構造の一部であり、それ自身も完全な木構造となっている部分を指す。木構造 T の任意のノードは、その配下の全ノードと共に T の部分木を構成する。根ノードを頂点とする部分木は、その木構造全体と等しい。根ノード以外を頂点とする部分木は真部分木(proper subtree)と呼ばれる(部分集合と真部分集合とのアナロジー)。 木構造における順序性木構造は2種類に分類される。順序性のない木と、順序性のある木である。順序性のない木は、構造的には木だが、あるノードの子ノード群には順序が存在しない。順序性のある木では、各エッジ(枝)に異なる自然数を付与するなどして子ノード間に順序性が存在する。これを順序木(ordered tree)と呼ぶ。一般に実際に使われるデータ構造としては順序木の方が典型的である。2分探索木は順序木の一種である。 実装方法コンピュータで利用する場合にはいくつかの実装方法がある。典型的な実装としては、動的メモリ確保でノードを表す構造体の領域を確保し、ポインタで親ノードや子ノードを参照できるようにする。
他にも、配列を使った実装(ポインタではなく、インデックスによって親子関係が決定される)などがある(例えば、二分ヒープ)。 グラフとしての木構造グラフ理論では、木とは非環状(ループを持たない)グラフを意味する。根付き木は、根として選ばれたノードを持つグラフである。この場合、エッジでつながれた2つのノードには親子関係が成り立つ。 走査法木構造の走査(traversal)とは、木構造にある全ノードを一回ずつ体系的に調査する処理である。以下のアルゴリズムは二分木に関するものだが、他の木構造にも応用可能である。連結リストや1次元の配列のような線形性のあるデータ構造では、走査は順番に行われるだけで、論理的には一種類しかない。しかし、木構造の走査にはいくつかの方法がある。一般に、現在のノードを調査し、その子ノードに対して同じことを繰り返す。従って、再帰呼び出しで容易に表現できる(ループでも実装可能)。走査法は、ノードを調査する順序によって以下の3つに分類される(いずれの方法も、根から探索を開始する)。
これらとは別にレベル順の走査もある。この場合、「深さ」のレベルが同じノードを浅い方から順に走査していく。これは、幅優先探索とも呼ばれる。 例
実装例
これらの実装では、木構造の高さのぶんだけコールスタック領域を必要とする。平衡が保たれていない木では、これが深刻な問題となる場合もある。各ノードの親ノードの位置を覚えておくことでスタックを使わないようにもできる。また、糸付き2分木を使う方法もある。糸付き2分木は、子ノードがない場合に間順の前と後ろをそれぞれ左の子ポインタと右の子ポインタに設定しておいた木構造である。この場合、子ノードの有無はポインタ以外のフィールドで示す必要がある。これを使うと、間順走査の効率が非常によくなるが、前順や後順は通常のスタックを使った実装の方がよい。 糸付き2分木を間順走査するコードは次のようになる。
主な操作
森森(forest)とは、順序木の順序集合である。森における前順、間順、後順の走査法は、これを木構造の木構造と考えることで再帰的に定義できる。 木構造の種類
コンピュータにみる木構造木構造は主に以下のような用途で使われる
関連項目参考文献
外部リンク
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net