Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Algorithms and Data Structures on C
木構造
Algorithms and Data Structures on C
この回の要点
• 木構造– 何を表す構造か?– 各部分の名称
• 木構造の実現方法– 配列を用いた実現– リンクを用いた実現– それぞれの場合の利点と欠点
• 二分木– 一般の木構造を二分木で表す– 小テスト①
• 木のなぞり– 3種類のなぞり方– 小テスト②
Algorithms and Data Structures on C
木構造とは
• 木(tree)、木構造(tree structure)– 階層関係を表現するデータ構造– 上下関係、親子関係ともいう
• 会社の組織• 本のチャプター、章、節• コンピュータのディレクトリ(フォルダ)
会社
営業部
第一
営業課
法人
営業課
総務部
人事課 総務課
技術部
技術課品質
管理課
PHP5大全
基本編
文法
配列
文字列
極意編
HTML
フォーム
セッション
DB編
MySQL
DBM
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)
Algorithms and Data Structures on C
木構造の定義
• 木の定義(再帰的定義)– 1つのノードは、それ自体を根とする木である。
– k個の木があり、それらの木の根を子とするノードを作ると、それは木である。
1 2
3 4
5
1 2
3 4
5
追加
tree1
tree2 new tree
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
木 グラフ
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
Algorithms and Data Structures on C
リンクによる木構造の実現1
• ノードからノードへリンク– ノードは高々1個の親を持つ。
• 親へのリンクが1つだけ必要
– ノードは0個以上の子を持つ。• 子へのリンクはたくさん必要• リスト構造により表現する
parent
child child・・・child
子ノードのリストノード
Algorithms and Data Structures on C
リンクによる木構造の実現2
• 利点– 構造の変更が容易
– 子や親の検索が容易
• 欠点– メモリ効率(リンクにメモリが必要)
– ノードの検索には子の数に応じた時間がかかる
0
1
3 5
2
6
9
4
7 8
null
Algorithms and Data Structures on C
順序木と無順序木
• 順序木(ordered tree)– 兄弟のノードに順序付けを行った木
– 左が長男→右に行くにつれて年下
• 一般に、データ構造としての木は、子ノードが何らかの形で並ぶのが普通– たとえば、線形リストで持つなど
– 一般的な木は順序木である
A
B C D
A
D B C
無順序木では等しい
年上 年下順序木では等しくない
Algorithms and Data Structures on C
二分木(binary tree)
• 二分木の定義– 空の木は二分木である– 次のいずれかの節のみからなる木は二分木である
• 子を持たない• 左の子のみを持つ• 右の子のみを持つ• 左右2個の子を持つ
A
B
C
D
A
B
C
D
A
B
C
D
二分木① 二分木② 二分木ではない(左右が不明)
等しくない
Algorithms and Data Structures on C
二分木の構造
• 二分木の子は多くても2つである– 2つの変数 left と right で表現可能
parent
left right
二分木ノード
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
Algorithms and Data Structures on C
小テスト①
• 次の木構造を二分木によって表せ。(30点)
0
1
3 5
2
6
9
4
7 8
10 11
Algorithms and Data Structures on C
解答①
0
1
3
5
26
9
4
7
8
10
11
親
子 兄弟
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
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
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
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
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
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
Algorithms and Data Structures on C
木構造終了