(Translated by https://www.hiragana.jp/)
木構造 (データ構造) - Wikipedia

構造こうぞう (データ構造こうぞう)

データ構造こうぞうのひとつ
ツリー構造こうぞうから転送てんそう

構造こうぞう(きこうぞう)とは、グラフ理論りろんにおける対応たいおうづけられるデータ構造こうぞうである。

親子おやこ構造こうぞう

用語ようご 編集へんしゅう

構造こうぞうは、一般いっぱんのグラフ構造こうぞう同様どうようの、ノード(節点せってん頂点ちょうてん)とノードあいだむすぶエッジ(えだあたり)あるいはリンクであらわすこともできるが、構造こうぞう専用せんようの、とく有向ゆうこう根付ねつとなるような表現ひょうげん使つかわれることもおおい。

データ構造こうぞうとして使つかわれるは、ほとんどの場合ばあいとなるノードがめられた根付ねつである。さらに、有向ゆうこうであることもおおい。[ちゅう 1]

ノードあいだ関係かんけい家系かけい見立みたてた用語ようご表現ひょうげんされる。構造こうぞうないかくノードは、0以上いじょうノード (えい: child node) をち、ノードは構造こうぞうないでは下方かほう存在そんざいする(構造こうぞう成長せいちょう方向ほうこうしたとするのが一般いっぱんてきである)。ノードをつノードは、ノードからればしんノード (えい: parent node) である。あるノードからて、おなおやつノードを兄弟きょうだいノード (えい: sibling node) という。あるノードからて、そのノードやそこからさきノードすべてのいずれかを子孫しそんノード (えい: descendant node) とび、そのおやノードやそこからさきしんノードのすべてのいずれかを先祖せんぞノード (えい: ancestor node) とぶ。ノードは高々たかだか1個いっこしんノードをつ。

ノード (えい: root node) とは、おやノードをたないノードのこと。ノードは構造こうぞうさい上位じょういにあるノードであり、1つの構造こうぞう高々たかだか1つしか存在そんざいしない。ノードからスタートして、おやからへ、またそのへ、とエッジを辿たどっていくと、あらゆるノードへかなら到達とうたつでき、そのような(から特定とくていノードまでの)経路けいろつね一意いちいである。しめ場合ばあいノードが一番いちばんじょうえがかれるのが普通ふつうである。二分にぶんヒープなどの構造こうぞうでは、ノードは特別とくべつ属性ぞくせいつ。構造こうぞうないすべてのノードは、そのノードを頂点ちょうてんとする部分ぶぶんノードとなすことができる。

ノード (えい: leaf node) とは、ノードをたないノードのこと。ノードは構造こうぞう下位かい末端まったんにあるノードであり、ひとつの複数ふくすう存在そんざいしうる。

内部ないぶノード (えい: internal nodeinner node) とは、ノードをつノード、すなわちノード以外いがいのノードのこと。

たか (えい: height) とは、あるノードについて、そのノードからその子孫しそんであるノードへのエッジすう最大さいだいのこと。 ノードのたかさはその構造こうぞうたかさである。

ふか (えい: depth) とは、ぎゃくに、あるノードについて、そのノードからノードまでのエッジすうのこと。ノードのふかさは 0 である。

部分ぶぶん (えい: subtree) は、構造こうぞう一部いちぶであり、それ自身じしん完全かんぜん構造こうぞうとなっている部分ぶぶんす。構造こうぞう T任意にんいのノードは、その配下はいかぜんノードとともT部分ぶぶん構成こうせいする。ノードを頂点ちょうてんとする部分ぶぶんは、その構造こうぞう全体ぜんたいひとしい。ノード以外いがい頂点ちょうてんとする部分ぶぶん真部まなべ分木ぶんき (えい: proper subtree) とばれる(部分ぶぶん集合しゅうごう部分ぶぶん集合しゅうごうとのアナロジー)。

もり (えい: forest) とは、集合しゅうごうのこと。グラフ理論りろんでは、もり閉路へいろをもたない(連結れんけつとはかぎらない)グラフである。 もり順序じゅんじょ順序じゅんじょ集合しゅうごうである場合ばあい、これをかんがえることでぜんじゅんあいだじゅんこうじゅん走査そうさほう再帰さいきてき定義ていぎできる。

ノードの順序じゅんじょせい 編集へんしゅう

あるノードのノードぐんあいだ順序じゅんじょ存在そんざいしないと、順序じゅんじょ存在そんざいするがある。順序じゅんじょせいのある実装じっそうするには、ノードをリストれたり、かくエッジ(えだ)にことなる自然しぜんすう付与ふよするなどしてノードあいだ順序じゅんじょれる。これが順序じゅんじょ (えい: ordered tree) である。順序じゅんじょ応用おうようとしては2ふん探索たんさくなどがある。コンピュータちゅうのデータ構造こうぞうとしては、順序じゅんじょ存在そんざいしないデータ構造こうぞうといったものは(セットがたのように存在そんざいはするが)あまり一般いっぱんてきではないため、普通ふつう実装じっそうでは自然しぜん順序じゅんじょとなる。

実装じっそう方法ほうほう 編集へんしゅう

コンピュータ利用りようする場合ばあいにはいくつかの実装じっそう方法ほうほうがある。典型てんけいてき実装じっそうとしては、動的どうてきメモリ確保かくほでノードをあらわ構造こうぞうたい領域りょういき確保かくほし、ポインタしんノードやノードを参照さんしょうできるようにする。

  • かくノードがノードへのポインタのリストを
  • かくノードがしんノードへのポインタを
  • かくノードがしんノードへのポインタとノードへのポインタのリストを
  • かくノードが長男ちょうなんノードへのポインタとおとうとノードへのポインタを

ほかにも、配列はいれつ使つかった実装じっそう(ポインタではなく、インデックスによって親子おやこ関係かんけい決定けっていされる)などがある(たとえば、二分にぶんヒープ)。

走査そうさほう 編集へんしゅう

 
ぜんじゅん: F, B, A, D, C, E, G, I, H
 
あいだじゅん: A, B, C, D, E, F, G, H, I
 
こうじゅん: A, C, E, D, B, H, I, G, F
 
レベルじゅん: F, B, G, A, D, I, C, E, H

構造こうぞう走査そうさ (えい: traverse) とは、構造こうぞうにあるぜんノードをいちかいずつ体系たいけいてき調査ちょうさする処理しょりである。連結れんけつリストや1次元じげん配列はいれつのような線形せんけいせいのあるデータ構造こうぞうでは、走査そうさ普通ふつうまえから順番じゅんばんおこなわれる(うしろからたどる方法ほうほうなどもある)。構造こうぞう走査そうさには下記かき方法ほうほうなどがある。以下いかのアルゴリズムは分木ぶんぎかんするものだが、多分たぶんにも応用おうよう可能かのうである。

ふか優先ゆうせん探索たんさく 編集へんしゅう

ふか優先ゆうせん探索たんさくは、現在げんざいのノードを調査ちょうさし、そのノードにたいしておなじことをかえす。したがって、再帰さいき容易ようい表現ひょうげんできる(ループでも実装じっそう可能かのう)。走査そうさほうは、ノードを調査ちょうさする順序じゅんじょによって以下いかの3つに分類ぶんるいされる(いずれの方法ほうほうも、から探索たんさく開始かいしする)。

ぜんじゅん先行せんこうじゅんぜんおけじゅんきがけじゅん (えい: pre-order)
  1. ノードを調査ちょうさする。
  2. もしあれば、ひだり部分ぶぶんまえじゅん走査そうさする。
  3. もしあれば、みぎ部分ぶぶんまえじゅん走査そうさする。
2ふん探索たんさくのコピーをつくさいによく利用りようされる。また、数式すうしき構文こうぶんからポーランド記法きほう表現ひょうげんるのにも利用りようされる。
あいだじゅん中間なかまじゅんとおりがけじゅん (えい: in-order)
  1. もしあれば、ひだり部分ぶぶんあいだじゅん走査そうさする。
  2. ノードを調査ちょうさする。
  3. もしあれば、みぎ部分ぶぶんあいだじゅん走査そうさする。
多分たぶんでは定義ていぎされない。2ふん探索たんさくでは、あいだじゅん走査そうさによって走査そうさするじゅんがソートされた順序じゅんじょになるため、よく使つかわれる。
こうじゅんこうくだりじゅんおけじゅんかえりがけじゅん (えい: post-order)
  1. もしあれば、ひだり部分ぶぶんこうじゅん走査そうさする。
  2. もしあれば、みぎ部分ぶぶんこうじゅん走査そうさする。
  3. ノードを調査ちょうさする。

幅優先はばゆうせん探索たんさく 編集へんしゅう

レベルじゅん (えい: level-order)
幅優先はばゆうせん探索たんさくは、ふかさがおなじノードをあさほうからじゅん走査そうさしていく。

走査そうされい 編集へんしゅう

  この2ふん探索たんさくにおいて、
  • ぜんじゅん走査そうさでの調査ちょうさじゅん: F, B, A, D, C, E, G, I, H
  • あいだじゅん走査そうさでの調査ちょうさじゅん: A, B, C, D, E, F, G, H, I
    • 2ふん探索たんさくでのあいだじゅん走査そうさは、ソートされたじゅんとなる。
  • こうじゅん走査そうさでの調査ちょうさじゅん: A, C, E, D, B, H, I, G, F
  • レベルじゅん走査そうさでの調査ちょうさじゅん: F, B, G, A, D, I, C, E, H

擬似ぎじコード 編集へんしゅう

ぜんじゅん(n)
    n を処理しょり
    for each (n のノード i)
        ぜんじゅん(i)
あいだじゅん(n)
    if (n にひだりノードがあれば)
        あいだじゅん(n のひだりノード)
    n を処理しょり
    if (n にみぎノードがあれば)
        あいだじゅん(n のみぎノード)
こうじゅん(n)
    for each (n のノード i)
        じゅん(i)
    n を処理しょり

これらの実装じっそうでは、構造こうぞうたかさのぶんだけコールスタック領域りょういき必要ひつようとする。平衡へいこうたもたれていないでは、これが深刻しんこく問題もんだいとなる場合ばあいもある。かくノードのしんノードの位置いちおぼえておくことでスタックを使つかわないようにもできる。

下記かきはレベルじゅん擬似ぎじコード。

レベルじゅん(n)
    n をキューに追加ついか
    while (キューに要素ようそふくむなら)
        n ← キューからす
        n を処理しょり
        for each (n のノード i)
            i をキューに追加ついか

いとき2分木ぶんぎ 編集へんしゅう

 
いとき2分木ぶんぎ

また、いとき2分木ぶんぎ英語えいごばん (えい: threaded binary tree) を使つか方法ほうほうもある。Joseph M. Morris が1979ねん発表はっぴょうした[1]いとき2分木ぶんぎは、ノードがない場合ばあいあいだじゅんまえうしろをそれぞれひだりポインタとみぎポインタに設定せっていしておいた構造こうぞうである。この場合ばあいノードの有無うむはポインタ以外いがいのフィールドでしめ必要ひつようがある。これを使つかうと、あいだじゅん走査そうさ効率こうりつ非常ひじょうによくなるが、ぜんじゅんこうじゅん通常つうじょうのスタックを使つかった実装じっそうほうがよい。

いとき2分木ぶんぎあいだじゅん走査そうさするコードはつぎのようになる。

Sub inorder(n∈node)
    Do While hasLeftChild(n)
        Let node ← node.left
    Loop
    Do
        visit(n)
        If hasRightChild(n) Then
            Let n ← n.right
            Do While hasLeftChild(n)
                Let n ← n.left
            Loop
        Else
            Let n ← n.right
        End If
    Loop While n ≠ Null
End Sub

おも操作そうさ 編集へんしゅう

  • アイテム(データをつノード)すうかぞげる。
  • あるアイテムを探索たんさくする。
  • あらたなアイテムを構造こうぞう特定とくてい位置いち追加ついかする。
  • アイテムを削除さくじょする。
  • 部分ぶぶん削除さくじょする(えだり)
  • 部分ぶぶん追加ついかする(
  • 任意にんいのノードからノードをさがす。

構造こうぞう種類しゅるい 編集へんしゅう

コンピュータにみる構造こうぞう 編集へんしゅう

構造こうぞうおも以下いかのような用途ようと使つかわれる

脚注きゃくちゅう 編集へんしゅう

注釈ちゅうしゃく 編集へんしゅう

  1. ^ 一般いっぱんこうは、それにふくまれる任意にんいのノードをとして解釈かいしゃく可能かのう根付ねつである。有向ゆうこうは、エッジが、からかうきの場合ばあいと、からむかきの場合ばあいがあるが、いずれにしてもとなるノードがめられた根付ねつとなる。

出典しゅってん 編集へんしゅう

  1. ^ Morris, Joseph M. (December 1979). “Traversing binary trees simply and cheaply”. Information Processing Letters 9 (5): 197-200. doi:10.1016/0020-0190(79)90068-1. 

関連かんれん項目こうもく 編集へんしゅう

参考さんこう文献ぶんけん 編集へんしゅう

  • Donald Knuth. The Art of Computer Programming: Fundamental Algorithms, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89683-4 . Section 2.3: Trees, pp.308–423.
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7 . Section 10.4: Representing rooted trees, pp.214–217. Chapters 12–14 (Binary Search Trees, Red-Black Trees, Augmenting Data Structures), pp.253–320.
  • Dale, Nell. Lilly, Susan D. "Pascal Plus Data Structures". D. C. Heath and Company. Lexington, MA. 1995. Fourth Edition.
  • Drozdek, Adam. "Data Structures and Algorithms in C++". Brook/Cole. Pacific Grove, CA. 2001. Second edition.

外部がいぶリンク 編集へんしゅう