データ構造と アルゴリズム 第七回 知能情報学部 新田直也.

Slides:



Advertisements
Similar presentations
組合せ最適化輪講 2.3 連結性 川原 純. 2.3 連結性 内容 – グラフ上の節点をすべてたどるアルゴリズム 計算機上でのグラフの表現 – 強連結成分を求めるアルゴリズム トポロジカル順序を求める方法も – k- 連結、 k- 辺連結について – 2- 連結グラフの耳分解について.
Advertisements

区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
正規表現からのDFA直接構成.
アルゴリズムとデータ構造 第8回 ソート(3).
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
2章 データ構造.
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
情報工学概論 (アルゴリズムとデータ構造)
第11講: 平成18年12月 8日 (金) 4限 E352教室 グラフ (1).
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月14日
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
データ構造とアルゴリズム論 第9章 木構造 平成17年12月20日 森田 彦.
二分探索木によるサーチ.
Cプログラミング演習 中間まとめ2.
茨城大学 工学部 知能システム工学科 井上 康介 E2棟801号室
アルゴリズムとデータ構造 2011年7月4日
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
アルゴリズムとデータ構造1 2006年7月4日
離散数学 08. グラフの探索 五島.
1 T 行きがけ順: A B D F I J C G H 通りがけ順: D B I F J A G C H
アルゴリズムとデータ構造1 2006年6月16日
二分木のメソッド(続き).
木の走査.
アルゴリズムとデータ構造勉強会 第6回 スレッド木
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
二分探索木における要素削除 データ構造とプログラミング(10)
第9回 優先度つき待ち行列,ヒープ,二分探索木
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
離散数学 07. 木 五島.
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Cプログラミング演習 第10回 二分探索木.
データ構造とアルゴリズム論 第9章 木構造 平成29年12月20日 森田 彦.
データ構造とアルゴリズム論 第9章 木構造 平成30年6月27日 森田 彦.
復習+α JBuilderの使い方を思い出す。 配列とGUI 再帰とマージソート 木と二分木の探索
アルゴリズムとデータ構造 2010年7月26日
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング 4 木構造とヒープ.
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月16日
アルゴリズムとデータ構造 2013年7月1日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 2013年7月8日
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
アルゴリズムとデータ構造 2013年6月20日
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
アルゴリズムとデータ構造 2012年7月9日
Presentation transcript:

データ構造と アルゴリズム 第七回 知能情報学部 新田直也

二分木 二分木: すべての節点が子をたかだか2つしか持たない順序木. (a + b) * c + (d / -e) + 子が2個 * / 子が1個 a b e 子が0個

二分木の表現(1) 例によってWebで...

二分木の表現(2) struct node { char value; struct node *left; struct node *right; } ラベル 1ノードに相当 (構造体) 左の子のアドレス 右の子のアドレス

二分木の巡回法 木の巡回(traverse):各節を1回づつ全節を調べる. 深さ優先探索法と幅優先探索法に分類される. + + * / * c d - + c d - a b e a b e 深さ優先探索 幅優先探索

深さ優先探索の種類 行きがけ順,帰りがけ順,通りがけ順の3通り. 行きがけ順:根→(左部分木)→(右部分木) (一回目) 行きがけ順:根→(左部分木)→(右部分木) (一回目) 帰りがけ順:(左部分木)→(右部分木)→根 (三回目) 通りがけ順:(左部分木)→根→(右部分木) (二回目) + * / + c d - a b e

行きがけ順 行きがけ順: 根 → (左部分木) → (右部分木) →処理順は +*+abc/d-e + / * + c d - a b e (1) + (2) (2) (3) (2-1) / * (2-2) (2-2) (2-2-1) + (2-3) c d - (2-2-2) (2-2-3) a b e →処理順は +*+abc/d-e

帰りがけ順 帰りがけ順: (左部分木) → (右部分木) → 根 →処理順は ab+c*de-/+ + / * + c d - a b e (3) + (1) (1) (2) (1-3) / * (1-1) (1-1) (1-1-3) + (1-2) c d - (1-1-1) (1-1-2) a b e →処理順は ab+c*de-/+

通りがけ順 通りがけ順: (左部分木) → 根→ (右部分木) →処理順は a+b*c+d/e- + / * + c d - a b e (2) + (1) (1) (3) (1-2) / * (1-1) (1-1) (1-1-2) + (1-3) c d - (1-1-1) (1-1-3) a b e →処理順は a+b*c+d/e-

アルゴリズムの記述 手続き的に行きがけ順を記述すると… 木の根をnとおく スタックを空にする ノードnを調べる yes nが葉か? yes スタックが 空か? no no nの右の子を スタックに積む スタックから ノードを取り出し nとおく nの左の子をnとおく End

再帰アルゴリズムによる記述 再帰アルゴリズムだとシンプルに記述できる. void traverse(struct node *n) { if (n->left != NULL) traverse(n->left); if (n->right != NULL) traverse(n->right); return; }

再帰アルゴリズムの動作 + + / * * + + c c d - a a b b e void traverse(struct node *n) { [n に対して処理] if (n->left != NULL) traverse(n->left); if (n->right != NULL) traverse(n->right); return; } + + void traverse(struct node *n) { [n に対して処理] if (n->left != NULL) traverse(n->left); if (n->right != NULL) traverse(n->right); return; } / * * void traverse(struct node *n) { [n に対して処理] if (n->left != NULL) traverse(n->left); if (n->right != NULL) traverse(n->right); return; } + + c c d - a a b b e void traverse(struct node *n) { [n に対して処理] if (n->left != NULL) traverse(n->left); if (n->right != NULL) traverse(n->right); return; }

順序木の表現(1)

順序木の表現(2) struct node { char value; struct node *sibling; struct node *chlid; } ラベル 1ノードに相当 (構造体) 兄弟のアドレス 子供のアドレス

順序木と二分木 順序木を二分木とみなすことができる. f f g g f h a f a b a h a b b a h b h b b a