• 検索結果がありません。

ヒントスライドPDF プログラミング演習2 #prog2bkc net

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPDF プログラミング演習2 #prog2bkc net"

Copied!
22
0
0

読み込み中.... (全文を見る)

全文

(1)

第13週

木構造と探索(2)

2分探索木における挿入と探索

(2)

復習:2分探索木

定義(広い意味での定義)

• 根付き2分木の各点に要素を1つずつ対称順に配置したもの

対称順とは

– 例えば下記のような順序関係を指す

例:18は、左側最大(15)より大きく、右側最小(21)より小さい 点vの左側の

要素の最大値

点vの要素

点vの右側の 要素の最小値 18

9 22

(3)

3

復習:正則2分木

定義

– 各点が左子、右子の両方の子を持つか、

または全く子を持たない根付き2分木

– (左子、右子の一方のみが存在する場合は正則2分木で

はない)

• すべての2分探索木は正則2分木として考えられる?

– 方法: 左子、右子の一方しか存在しない場合は外点

を追加して正則2分木に変形

– 外点: 要素が何も配置されていない点

(演習では要素0の点)

内点 18 外点

9 22

4 12 21 31

25

7

0 0 15 0 0

0

0 0 0 0 0

18

9 22

4 12 21 31

25

7 15

0

(4)

必須課題13-1: new_node

int insert(int key, struct node *root)

2 分探索木の根を示すポインタ 挿入する要素の値

・機能:

2 分探索木を探索し,適切な位置に要素key を挿入する.

・引数key:

挿入する要素の値(キー)

・引数root:

2 分探索木の根を示すポインタ

(5)

insert 手順の例:1/5

例:16を挿入する場合

16

18より小さいので左側へ

18

9 22

4 12 21 31

25

7

0 0 15 0 0

0

0 0 0 0 0

(6)

insert 手順の例:2/5

例:16を挿入する場合

16

9より大きいので右側へ

18

9 22

4 12 21 31

25

7

0 0 15 0 0

0

0 0 0 0 0

(7)

7

insert 手順の例:3/5

例:16を挿入する場合

16

12より大きいので右側へ

18

9 22

4 12 21 31

25

7

0 0 15 0 0

0

0 0 0 0 0

(8)

insert 手順の例:4/5

例:16を挿入する場合

16

15より大きいので右側へ

16 18

9 22

4 12 21 31

25

7

0 0 15 0 0

0

0 0 0 0 0

(9)

9

insert 手順の例:1/5

例:16を挿入する場合

外点に到達したので挿入し 新たに外点を追加する

18

9 22

4 12 21 31

25

7

0 0 15 0 0

0

0 0 16 0 0

0 0

(10)

必須課題13-1:2分探索木の初期状態

2分探索木の初期状態(木が空)のときは、

外点が一つある

初期状態

木にノードがないとき(外点のみ) ノード一つのとき 要素の挿入

(課題13-1

要素の削除

key

挿入された keyの値

(11)

11

必須課題13-1:参考プログラム

int main(void){ int key;

struct node *root = new_node(0); for(;;){

printf("挿入するキーを入力して下さい:"); scanf("%d",&key);

if(key > 0){

if( insert(key,root) == 1){ print_tree(root);

}else{

printf("その値はすでに存在します。¥n"); print_tree(root);

} }else{

printf("正でない数値が入力されたので終了します。¥n"); free_tree(root);

return 0; }

} }

初期状態、外点のみ

全てのノードのメモリを解放する プログラムは次ページを参照

12週目に提供された関数

(12)

free_tree: すべてのnodeのメモリを解放する関数

void free_tree(struct node *node) { if(node != NULL){

free_tree(node->left); free_tree(node->right); free(node);

} }

(13)

正則二分探索木の探索: member (1)

根からはじめ,ノードの値と探索対象の値を比較しなが

ら木をたどる

• 着目ノードの値 < 探索値ならば右子へ

• 着目ノードの値 > 探索値ならば左子へ

• 着目ノードの値 = 探索値ならば探索対象発見,終了

• 着目ノードが外点ならば探索対象なし,終了

18

9 22

4 12 21 31

25

7

0 0 0 0 0

0

0 0 0

25を探索

(14)

正則二分探索木の探索: member (2)

根からはじめ,ノードの値と探索対象の値を比較しなが

ら木をたどる

• 着目ノードの値 < 探索値ならば右子へ

• 着目ノードの値 > 探索値ならば左子へ

• 着目ノードの値 = 探索値ならば探索対象発見,終了

• 着目ノードが外点ならば探索対象なし,終了

18

9 22

4 12 21 31

6を探索

(15)

再帰

関数内で自分自身を呼ぶこと

factorial: 階乗 15

int factorial(int x){

if(x==0){

return 1;

}

return x*factorial(x-1);

}

int main(){

factorial(3);

return 0;

}

再帰呼び出しの例

main

factorial(3)

factorial(2)

factorial(1)

factorial(0)

戻り値1 戻り値1 戻り値2 戻り値6 呼出

呼出 呼出 呼出

無限ループに注意!

(16)

再帰 オプション課題13-2

member_recursive関数の中で

member_recursive 関数を呼ぶ

• 探索する値keyと現在のノードのキーを比較

• 比較結果によって、再帰呼び出しの際、

member_recursive に渡す引数を変える

• 再帰呼び出しの終了は、

外点にぶつかるか、keyを発見したとき

(17)

正則二分探索木からの削除(1)

根からはじめ,ノードの値と挿入する値を比較し

ながら木をたどり,削除対象となる内点を探索

• 着目ノードの値 < 挿入する値ならば右子へ

• 着目ノードの値 > 挿入する値ならば左子へ

• 着目ノードの値 = 挿入する値ならば挿入せず終了

18

9 22

4 12 21 31

25

7

0 0 0 0 0

0

0 0 0

削除データ:12

(18)

正則二分探索木からの削除(1)

削除対象ノードの右子・左子ともに外点のとき

• 削除対象ノードを外点にする

– データを外点値にする

左子,右子をなくす

18

9 22

4 12 21 31

12を削除 18

9 22

4 0 21 31

(19)

0 0

正則二分探索木からの削除(2)

削除対象ノードの右子(左子)が内点のとき

• 右子(左子)を根とする部分木の最小値(最大値)ノードを外

点にする

• 削除対象ノードの値を最小値(最大値)に変える

18

9 22

4 12 21 31

25

7 0

0 0 0

0

0 0 0

22を削除 18

9 25

4 12 21 31

0

7 0

0 0 0

0 0

右部分木の最小値: 25

0 0

(20)

正則二分探索木からの削除(3)

削除対象ノードの右子・左子ともに内点のとき

• 右子のみが内点のときと同様にできる

• 右子を根とする部分木の最小値ノードを外点にする

• 削除対象ノードの値を最小値に変える

18

9 22

4 12 0 31

22を削除 18

9 25

4 12 0 31

(21)

注意

ノード作成にはmalloc関数を使うことになりますが

• ノードを木からなくすときには free関数によるメモリ解放 を

忘れずに!!!

• 例: 課題12-4 木からのノード削除

18

9 22

4 12 21 31

25

7 0

0 0 0 0 0

0

0 0 0

12を削除

free 対象となるノードた

(22)

著者リスト

1. 安積 卓也(情報システム学科)

2. 大森 隆行(情報システム学科)

3. 原田 史子(情報システム学科)

参照

関連したドキュメント

社会調査論 調査企画演習 調査統計演習 フィールドワーク演習 統計解析演習A~C 社会統計学Ⅰ 社会統計学Ⅱ 社会統計学Ⅲ.

Mexican Northern Southern Western Cutworm species European Corn Borer Fall Armyworm 1 Flea Beetle species Grasshopper species Japanese Beetle (Adult) Sap Beetle (Adult)

「AI 活用データサイエンス実践演習」 「AI

卒論の 使用言語 選考要件. 志望者への

国際地域理解入門B 国際学入門 日本経済基礎 Japanese Economy 基礎演習A 基礎演習B 国際移民論 研究演習Ⅰ 研究演習Ⅱ 卒業論文

授業は行っていません。このため、井口担当の 3 年生の研究演習は、2022 年度春学期に 2 コマ行います。また、井口担当の 4 年生の研究演習は、 2023 年秋学期に 2

使用言語 日本語 選考要件. 登録届を提出するまでに個別面談を受けてください。留学中で直接面談 できない場合は Skype か

卒論の 使用言語 選考要件