木構造

木構造(きこうぞう、tree structure)とは

  • 木構造とは、データ構造の一つで、一つの要素(ノード)が複数の子要素を持ち、一つの子要素が複数の孫要素を持ち、という形で階層が深くなるほど枝分かれしていく構造のこと。
  • 木が幹から枝、枝から葉に分岐していく様子に似ているためこのように呼ばれる。
  • ツリー構造ともいう。

データ構造の最小単位の名称

様々な呼び方がある(データ構造のモデルにより呼び方が異なる)

  • 要素
  • セル ・・・ リスト
  • ノード ・・・ 木構造

木構造の構成要素

  • 節(ノード):各要素(データ)。根でも葉でもないノードは節点という。
  • 根(ルート):最上位のノード。木構造に一つだけ存在する。
  • 葉(リーフ):最下位のノード。
  • 枝(ブランチ):各ノードを関係づける線

親ノード、子ノード

ノードには親ノード子ノードがある

2分木:子ノードの数を2個以下に限定した木構造

多分木:子ノードの数が3個以上の木構造

2分木

2分木には、さらに全2分木と完全2分木がある。

  • 全2分木:子ノードの数が必ず2個の2分木
  • 完全2分木:根から葉までの全ての深さが同じ、または1つしか違わない2分木

左部分木 右部分木

あるノードから見て左側の下階層を左部分木、右側の下階層を右部分木という

木構造 ポインタを使って表現

木構造はポインタを使ってリストのように表現することができる

走査(トラバース traverse) 木の巡回法

  • 走査とは、木構造からノード値を取り出していく方法
  • 幅優先探索深さ優先探索がある

幅優先探索

根から順に、同一レベルの左から右にノード値を取り出していく

深さ優先探索

探査はルートから次のように一筆書きで行う

  • 葉以外のノードは、3回通過する。どのタイミングでデータを取り出すかで、前順(先行順)間順(中間順)後順(後行順)がある

上図でノードBを取り出すタイミングが

A B C 前順(先行順)

A C B 間順(中間順)

A C D B 後順(後行順)

例題1

図に示す2分木に対して走査を行い、節の値を出力する。前順、間順、後順、それぞれの方法の出力結果を書きなさい。

例題1 解答

前順 A⇒B⇒C⇒D⇒E

間順  C⇒B⇒D⇒A⇒E

後順  C⇒D⇒B⇒E⇒A

2分探索木(binary search tree)

  • 2分探索木とは「左部分木の値 ≦ 親ノードの値 ≦ 右部分木の値」という制約を持つ2分木
  • 要素の挿入・削除・検索を高速に行うことの出来る
  • 探索木とは、データを探索するための構造を持った木構造のこと

例題2

「5」を探索する場合、探索の進む経路の値を下記に書きなさい。

例題2 解答

10 → 7 → 4 → 5

例題2-2

「13」を探索する場合、探索の進む経路の値を書きなさい。

例題2-2 解答

10 → 15 → 11 → 13

2分探索木 登録(追加)

①登録(追加)する位置の探索をルートから始める。探索が不能になるまで探索を続ける。

②不能となった位置の末尾にデータを登録(追加)する。

例題3

例題3 解答

「8」を探索する 10 → 7 → 9 → 探索不能

「9」の末尾に「8」を登録する

2分探索木 削除

削除には3つのパターンがある

①子を1つも持たない場合

②子を1つだけ持っている場合

③子を2つ持っている場合

そのため、3つのパターンで処理を分ける。

①子を1つも持たない場合→そのノードを取り去る→該当する親のポインタをNULLにする

②子を1つだけ持っている場合 → 削除するノードに、そのノードが持っていた子を持ってくる

③子を2つ持っている場合 → 削除するノードを右部分木の最小の要素で置き換える

例題4

設問1 値「9」を削除するとどうなるか、変更点を図で書きなさい。

設問2 値「11」を削除するとどうなるか、変更点を図で書きなさい。

設問3 値「15」を削除するとどうなるか、変更点を図で書きなさい。

ヒープ(Heap)

ヒープ(Heap)とは

  • 完全2分木の中で、どの親子をとっても親<子(または親>子)となっている
  • 子どうしの要素についての大小関係は問わない
  • ルートが最大または最小の値となる

ヒープ 検索

二分探索木のように「左の子<親<右の子」という関係がないので、データの検索はすべての要素を順次探索する。

ヒープ 登録(追加)

例題5

次のヒープに「7」を登録(追加)するとどうなるか?

①まず、最下段に左詰めで葉を追加する。

②ヒープ条件(親≦子)を満たすように葉から根に向けて値を交換する。

ヒープ 削除

例題6

次のヒープから「10」を削除するとどうなるか?

①削除したデータの位置に最後尾(末尾)のデータを持ってくる

②親<子」の関係になるように、適正な位置まで順次、子と交換する

ヒープソート

  • ソートのアルゴリズムの一つ
  • データをヒープ構造にし、完成したらデータの先頭の値を取り出す。そしてまたヒープ構造を作り・・・という繰り返しでソートする手法

例題7

ヒープソートにより昇順にソートする。空欄を埋めなさい。

解答

平衡木(バランスツリー、B木)

葉の深さがなるべく等しくなるように構築された木を「平衡木」(バランスツリー、B木)と呼ぶ。

AVL木(平衡2分木)

  • 2分探索木で要素の挿入・削除を行った後に、木の平衡が崩れた場合には再編成を行う
  • 各ノードにおいても、左右の部分木の高さが1以内の2分木に再編成する
  • 3人の考案者(Adelson-Velskii-Landis)の頭文字からAVL木と呼ばれる
  • 再編成は、ノードへのアクセス効率が低下しないように行う

※AVL木は、2分探索木のアクセス効率を低下しないように工夫した構造

 

まとめ 木構造の分類

■ノードの持つ子の個数での分類

  • 2分木
  • 多分木

※特に2分木(binary tree)がよく使われる

■ノード間に順序がある木構造・・・順序木(ordered tree)

  • 2分探索木 binary search tree
  • ヒープ・・・半順序木ともよぶ

■再編成を行う木構造・・・バランス木(平衡木)

  • AVL木(平衡2分木)
  • B木

確認問題

1.木構造の構成要素の名称を埋めなさい。

2.ノードには( a )と( b )がある。

3.子ノードの数を2個以下に限定した2分木を( a )、根から葉までの全ての深さが同じ、または1つしか違わない2分木を( b )という。

4.あるノードから見て左側の下階層を( a )、右側の下階層を( b )という。

5.走査(トラバース)には、( a )と( b )がある。

6.幅優先探索は、( a )から順に、同一レベルの( b )から( c )にノード値を取り出していく。

7.深さ優先探索では、葉以外のノードは、3回通過する。どのタイミングでデータを取り出すかで、( a )、( b )、( c )がある。

8.2分木で「左部分木の値 ≦ 親ノードの値 ≦ 右部分木の値」という制約を持つ構造を、( a )という。

9.2分探索木は、要素の挿入・削除・検索を( a )に行うことの出来る。

10.データを探索するための構造を持った木構造のことを( a )という。

11.完全2分木の中で、どの親子をとっても親<子(または親>子)となっており、子どうしの要素についての大小関係は問わない構造を、( a )という。

12.ヒープでは、ルートが( a )の値となる。

13.データをヒープ構造にし、完成したらデータの先頭の値を取り出す。そしてまたヒープ構造を作り・・・という繰り返しでソートする手法を( a )という。

14.葉の深さがなるべく等しくなるように構築された木を( a )と呼ぶ。

15.二分探索木で、各ノードにおいても、左右の部分木の高さが1以内の2分木に再編成する構造を( a )という。

基本情報対策問題

1.2分木の走査の方法には、その順序によって次の三つがある。

(1) 前順: 節点、左部分木、右部分木の順に走査する。

(2) 間順: 左部分木、節点、右部分木の順に走査する。

(3) 後順: 左部分木、右部分木、節点の順に走査する。

図に示す2分木に対して走査を行い、節の値を出力する。前順、間順、後順、それぞれの方法の出力結果を書きなさい。(平成15年度・秋期 午前 改題)

2.節点1、2、…、n をもつ木を表現するために、大きさn の整数型配列A[1]、A[2]、…、A[n ]を用意して、節i の親の番号をA[i ]に格納する。節点k が根の場合はA[k]=0とする。表に示す配列が表す木の葉の数は、幾つか。(平成22年度・秋期 午前)

ア 1        イ 3        ウ 5        エ 7

3.2分木の各ノードがもつ記号を出力する再帰的なプログラムProc(ノードn )は、次のように定義される。このプログラムを、図の2分木の根(最上位のノード)に適用したときの出力はどれか。(平成19年度・秋期 午前)

Proc(ノードn) {

n に左の子l があればProc(l )を呼び出す

n に右の子r があればProc(r )を呼び出す

n に書かれた記号を出力する

}

ア b-c*d+a         イ +a*-bcd

ウ a+b-c*d  エ abc-d*+

4.すべての葉が同じ深さをもち、葉以外のすべての節点が二つの子をもつ2分木に関して、節点数と深さの関係を表す式はどれか。ここで、n は節点数、k は根から葉までの深さを表す。例に示す2分木の深さk は2である。(平成17年度・秋期 午前)

ア n = k (k +1)+1   イ n = 2k+3

ウ n = 2k1-1        エ n = (k -1)(k +1)+4

5.次の2分探索木から要素12を削除したとき、その位置に別の要素を移動するだけで2分探索木を再構成するには、削除された節点の位置にどの要素を移動すればよいか。(平成25年度・春期 午前)

ア 9        イ 10      ウ 13      エ 14

6.次の2分探索木に12を追加したとき、追加された節12の位置を正しく表している図はどれか。(平成19年度・春期 午前)

7.2分探索木として適切なものはどれか。ここで、1~9の数字は、各ノード(節)の値を表す。(平成17年度・春期 午前)

8.ヒープソートの説明として,適切なものはどれか。

ア.ある間隔おきに取り出した要素から成る部分列をそれぞれ整列し,更に間隔を詰めて同様の操作を行い,間隔が1になるまでこれを繰り返す。

イ.中間的な基準値を決めて,それよりも大きな値を集めた区分と,小さな値を集めた区分に要素を振り分ける。次に,それぞれの区分の中で同様な処理を繰り返す。

ウ.隣り合う要素を比較して,大小の順が逆であれば,それらの要素を入れ替えるという操作を繰り返す。

エ.未整列の部分を順序木にし,そこから最小値を取り出して整列済の部分に移す。この操作を繰り返して,未整列の部分を縮めていく。