22
Algorithms and Data Structures on C 木構造

木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

木構造

Page 2: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

この回の要点

• 木構造– 何を表す構造か?– 各部分の名称

• 木構造の実現方法– 配列を用いた実現– リンクを用いた実現– それぞれの場合の利点と欠点

• 二分木– 一般の木構造を二分木で表す– 小テスト①

• 木のなぞり– 3種類のなぞり方– 小テスト②

Page 3: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

木構造とは

• 木(tree)、木構造(tree structure)– 階層関係を表現するデータ構造– 上下関係、親子関係ともいう

• 会社の組織• 本のチャプター、章、節• コンピュータのディレクトリ(フォルダ)

会社

営業部

第一

営業課

法人

営業課

総務部

人事課 総務課

技術部

技術課品質

管理課

PHP5大全

基本編

文法

配列

文字列

極意編

HTML

フォーム

セッション

DB編

MySQL

DBM

Page 4: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

木の名称・用語

0

1

3 5

2

6

9

4

7 8

レベル0

レベル1

レベル2

レベル3

根(root)

節(node)ノード

頂点(vertex)

葉(leaf)

親子(parent→child)

兄弟(sibling)

祖先(ancestor)

子孫(descendant)

部分木(subtree)

Page 5: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

木構造の定義

• 木の定義(再帰的定義)– 1つのノードは、それ自体を根とする木である。

– k個の木があり、それらの木の根を子とするノードを作ると、それは木である。

1 2

3 4

5

1 2

3 4

5

追加

tree1

tree2 new tree

Page 6: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

木とグラフ

• 木– 根を除くすべての節はただ1つの親を持つ

• グラフ– 2つ以上の親を持つような構造– より一般的な構造

0

1

3 5

2

6

9

4

7 8

0

1

3 5

2

6

9

4

7 8

木 グラフ

Page 7: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

配列による木構造の実現

• 各ノードを配列要素– 木のノードは、根を除いて単一の親を持つ– ノードを配列に入れ、親の番号を保存する

• 利点と欠点– 利点:メモリ量は少ない– 欠点:子の探索に要する時間が非効率的

• 実質的に線形探索と同じ• 下から上への探索は効率が良い

-1

0

0

1

1

1

2

4

4

6

T[]

0

1

2

3

4

5

6

7

8

9

親の番号

0

1

3 5

2

6

9

4

7 8

10

010

Page 8: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

リンクによる木構造の実現1

• ノードからノードへリンク– ノードは高々1個の親を持つ。

• 親へのリンクが1つだけ必要

– ノードは0個以上の子を持つ。• 子へのリンクはたくさん必要• リスト構造により表現する

parent

child child・・・child

子ノードのリストノード

Page 9: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

リンクによる木構造の実現2

• 利点– 構造の変更が容易

– 子や親の検索が容易

• 欠点– メモリ効率(リンクにメモリが必要)

– ノードの検索には子の数に応じた時間がかかる

0

1

3 5

2

6

9

4

7 8

null

Page 10: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

順序木と無順序木

• 順序木(ordered tree)– 兄弟のノードに順序付けを行った木

– 左が長男→右に行くにつれて年下

• 一般に、データ構造としての木は、子ノードが何らかの形で並ぶのが普通– たとえば、線形リストで持つなど

– 一般的な木は順序木である

A

B C D

A

D B C

無順序木では等しい

年上 年下順序木では等しくない

Page 11: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

二分木(binary tree)

• 二分木の定義– 空の木は二分木である– 次のいずれかの節のみからなる木は二分木である

• 子を持たない• 左の子のみを持つ• 右の子のみを持つ• 左右2個の子を持つ

A

B

C

D

A

B

C

D

A

B

C

D

二分木① 二分木② 二分木ではない(左右が不明)

等しくない

Page 12: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

二分木の構造

• 二分木の子は多くても2つである– 2つの変数 left と right で表現可能

parent

left right

二分木ノード

Page 13: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

二分木による木構造の実現

• 任意の木構造は二分木によって表現可能– 左→ 先頭の子

– 右→ 次の兄弟

0

1

3 5

2

6

9

4

7 8

7

0

1

2

6

9

3

4

5

8

Page 14: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

小テスト①

• 次の木構造を二分木によって表せ。(30点)

0

1

3 5

2

6

9

4

7 8

10 11

Page 15: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

解答①

0

1

3

5

26

9

4

7

8

10

11

子 兄弟

Page 16: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

木のなぞり

• なぞり(traverse)– 木のノードを系統的に1つ残らず1回ずつ巡ること– ノードの順序付けが可能

• なぞりの種類– 行きがけ順(pre-order)

• ノード→ 部分木• 0 → 1 → 2 → 3

– 通りがけ順(in-order)• 最初の部分木 → ノード→ 残りの部分木• 1 → 0 → 2 → 3

– 帰りがけ順(post-order)• 部分木 → ノード• 1 → 2 → 3 → 0

0

1 2 3

0

1 2 3

0

1 2 3

1

23

1

2

3

12

3

Page 17: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

各なぞりの違い

• 部分木内のなぞりは、再帰的に実行される

• 行きがけ順

0→1→3→4→7→8→5→2→6→9

• 通りがけ順

3→1→7→4→8→5→0→9→6→2

• 帰りがけ順

3→7→8→4→5→1→9→6→2→0

0

1

3 5

2

6

9

4

7 8

Page 18: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

小テスト②

• 次の木を3つの方法でなぞり、その順序を示せ。(各20点)

0

1

3 5

2

6

9

4

7 8

10 11

行きがけ順pre-order

通りがけ順in-order

帰りがけ順post-order

Page 19: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

解答②(続)

0

1

3 5

2

6

9

4

7 8

10 11

0

1

3 5

2

6

9

4

7 8

10 11

0

1

3 5

2

6

9

4

7 8

10 11

行きがけ順pre-order

通りがけ順in-order

帰りがけ順post-order

Page 20: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

解答②

• 行きがけ順

– 0→1→3→4→7→8→5→2→9→10→11→6

• 通りがけ順

– 3→1→7→4→8→9→2→10→11→5→6→0

• 帰りがけ順

– 3→7→8→4→9→10→11→2→5→6→1→0

Page 21: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

課題191111

• 次の木構造(二分木ではない)を3つのなぞりでなぞった経路を示せ。

• 作成方法:• ワードに左の木構造の図を貼り付け、その下に3つのなぞりの順番を番号で示すこと。

• ファイル名はscXXXXXX-al191111.docxとし、課題本文中にも学籍番号と氏名を明記すること。

• 提出方法:• メールで。• メールの本文中にも学籍番号を氏名を明記すること。

• 提出先:[email protected]

• メールタイトル:”アルゴリズム課題191111” ←厳守!

• 期限:2019年11月17日(日) 24:00

0

5

2

9

4

8

10 11

13

1

3 6

7

14

12

15

Page 22: 木構造fuchida/lecture/algorithm/alg...Algorithms and Data Structures on C リンクによる木構造の実現1 •ノードからノードへリンク –ノードは高々1個の親を持つ。•親へのリンクが1つだけ必要

Algorithms and Data Structures on C

木構造終了