大岩 元 慶応大学環境情報学部 ohiwa@sfc.keio.ac.jp 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部 ohiwa@sfc.keio.ac.jp.

Slides:



Advertisements
Similar presentations
データ構造とプログラミング技 法 (第3回) ー木構造ー. 木構造 (1) 根( root )と呼ばれる節 R が、 1 つだけ含まれ る。 R … TmTm T1T1 木構造: 1 個以上の節の有限集合 T であり、 次の二つの条件を満足するもの (2) 根以外の節は、 m (≧ 0 )個の互いに素な部.
Advertisements

アルゴリズムとデータ構造 2011年7月7日
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
オブジェクト指向入門.
アルゴリズムとデータ構造 2011年6月14日
最短経路.
アルゴリズム入門.
データ構造とアルゴリズム論 第9章 木構造 平成17年12月20日 森田 彦.
アルゴリズムとデータ構造 2012年7月12日
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
二分探索木によるサーチ.
Cプログラミング演習 中間まとめ2.
アルゴリズムとデータ構造 2011年7月4日
ハッシュ表 データ構造とプログラミング(12)
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2013年7月16日
アルゴリズムとデータ構造1 2006年7月4日
二分木のメソッド(続き).
木の走査.
アルゴリズムとデータ構造勉強会 第6回 スレッド木
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
二分探索木における要素削除 データ構造とプログラミング(10)
データ構造とアルゴリズム (第3回) ー木構造ー.
計算機プログラミングI 第11回 再帰 再帰的なメソッド定義 帰納的定義 再帰的なデータ構造 計算機プログラミングI (増原) 2003年度.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月17日
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
離散数学 07. 木 五島.
Cプログラミング演習 第10回 二分探索木.
データ構造とアルゴリズム論 第9章 木構造 平成29年12月20日 森田 彦.
データ構造とアルゴリズム論 第9章 木構造 平成30年6月27日 森田 彦.
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2010年7月26日
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
AVL木.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造 2011年7月11日
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2013年7月1日
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 2013年7月8日
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
アルゴリズムとデータ構造 2012年7月9日
Presentation transcript:

大岩 元 慶応大学環境情報学部 ohiwa@sfc.keio.ac.jp 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部 ohiwa@sfc.keio.ac.jp

二分木とは 挿入も探索も早い 順序配列は挿入が遅い 連結リストは探索が遅い 木とは複数の節(nodes、円で表わす)が辺(edge、線で表わす)で接続されたもので、根(root)と呼ばれる親の節から複数の子の節が辺で接続され、子の節からまた複数の子の節が辺で接続されるもの 子の数が2つ以下に限られるものを二分木と言う

木の用語 パス(path) 根(root) 親(parent) 子(children) 葉(leaf) 部分木(subtree) 訪問(visiting) 走査(traversing) 段(level) キー(key) 二分木(binary tree)

Nodeクラスの表現 class Node{ class Node{ Person p1; //Personオブジェクトへの参照 int Idata;      //キーとなるデータ float fData;     //その他のデータ node leftChild;  //左の子 node rightChild; //右の子 public void display() { …. } } class Node{  Person p1; //Personオブジェクトへの参照  node leftChild;  //左の子 node rightChild; //右の子 class Person{ int iData; float fData; public void display() { …. } }

Treeクラスの表現 class Tree[ private Node root; public void find(int key){ … } public void insert(int id; float fd){ … } public void delete(int id){ … } ….. }

TreeAppクラスの表現 class TreeApp{ public static void main(String[] args){ Tree theTree = new Tree; theTree.insert(50, 1.5); theTree.insert(25, 1.7); theTree.insert(75, 1.9); node found = theGree.find(25); if (found != NULL) System.out.println(“Found the node with key 25); else Wystem.out.println(“Could not find node with key 25”); }

節(ノード)の探索

節(ノード)探索のプログラム public Node find (int key) { Node current = root; //根(ルート)から出発 while (current.iData != key) { if (key < current.iData) current = current.leftChild; else current = current.rightChild; if ( current == null) return null; //見つからなかった } return current; //見つかった

節(ノード)の挿入

節(ノード)の挿入プログラム public void insert(int id, float fd){ Node newNode = new Node();//新節生成 newnode.idata = id; newNode.data = fd; if (rood == null) root = newNode; else { //根に節がない Node current = root;     //根から出発 Node parent; while (true) { parent = current; if (id < current.iData) { current = current.leftChild; if (current == null) { parent.leftChild = newNode; return; } else { current = current.rightChild; if (current == null) { parent.rightChild = newNode; return; }

木の走査(間順) private void inOrder(node localRoot) { if (localRoot != NULL) { inOrder( localRoot.leftChild ); localRoot.displayNode); inOrder( localRoot.rightChild); }

間順走査の実例 private void inOrder(node localRoot) { if (localRoot != NULL) { inOrder( localRoot.leftChild ); localRoot.displayNode); inOrder( localRoot.rightChild); }

数式の表現と木の走査 Inorder traverse Preorder traverse Postorder traverse

探索木の最小値探索 public Node minimum() { Node current, last; current = root; while (current != null) { last = current; current = current.leftChild; } return last;