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

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

N/A
N/A
Protected

Academic year: 2018

シェア "ヒントスライドPPT プログラミング演習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)

復習:正則 2 分木

定義

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

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

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

ではない)

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

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

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

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

(演習では要素0の点)

内点 18 外点

9 22

4 12 21 31

25

7 0

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 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 0 15 0 0

0

0 0 0 0 0

(7)

insert 手順の例: 3/5

例: 16 を挿入する場合

16

12より大きいので右側へ

< 18

9 22

4 12 21 31

25

7 0

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 0 15 0 0

0

0 0 0 0 0

(9)

insert 手順の例:1 /5

例: 16 を挿入する場合

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

18

9 22

4 12 21 31

25

7 0

0 0 15 0 0

0

0 0 16 0 0

0 0

(10)

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

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

外点が一つある

初期状態

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

要素の挿入

(課題13-1

要素の削除

key

挿入された keyの値

0 0

(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 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 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. 原田 史子(情報システム学科)

参照

関連したドキュメント

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

[21] Tomoaki Kodama, Yasuhiro Honda: A Study on the Modeling and Simulation Method of Torsional Vibration Considering Dynamic Properties of Rubber Parts for Engine Crankshaft

いてもらう権利﹂に関するものである︒また︑多数意見は本件の争点を歪曲した︒というのは︑第一に︑多数意見は

□ ゼミに関することですが、ゼ ミシンポの説明ではプレゼ ンの練習を主にするとのこ とで、教授もプレゼンの練習

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

 本資料は、宮城県に所在する税関官署で輸出通関又は輸入通関された貨物を、品目別・地域(国)別に、数量・金額等を集計して作成したもので

本資料は、宮城県に所在する税関官署で輸出通関又は輸入通関された貨物を、品目別・地域(国)別に、数量・金額等を集計して作成したもので

本資料は、宮城県に所在する税関官署で輸出通関又は輸入通関された貨物を、品目別・地域(国)別に、数量・金額等を集計して作成したもので