Microsoft Word - NonGenTree.doc

Similar documents
Microsoft Word - NonGenList.doc

明解Javaによるアルゴリズムとデータ構造

アルゴリズムとデータ構造1

新・明解Javaで学ぶアルゴリズムとデータ構造

明解Javaによるアルゴリズムとデータ構造

ALG ppt

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

Microsoft PowerPoint ppt

ALG ppt

memo

新・明解Javaで学ぶアルゴリズムとデータ構造

untitled

Taro-2分探索木Ⅰ(公開版).jtd

Prog1_15th

Javaによるアルゴリズムとデータ構造

Taro-2分探索木Ⅱ(公開版).jtd

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint - kougi10.ppt

デジタル表現論・第4回

新・明解Java入門

文字列操作と正規表現

8 if switch for while do while 2

Method(C 言語では関数と呼ぶ ) メソッドを使うと 処理を纏めて管理することができる 処理 ( メソッド ) の再実行 ( 再利用 ) が簡単にできる y 元々はC 言語の関数であり 入力値に対する値を 定義するもの 数学では F(x) = 2x + 1 など F(x)=2x+1 入力値 (

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

解きながら学ぶJava入門編

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

K227 Java 2

スライド 1

ALG2012-A.ppt

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

memo

ALG2012-C.ppt

Prog1_3rd

情報処理Ⅰ

untitled

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

基礎計算機演習 実習課題No6

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

Java講座

2

人工知能入門

問題1 以下に示すプログラムは、次の処理をするプログラムである

<4D F736F F D2091E F196E291E889F090E C4816A82CC838C E646F6378>

Microsoft PowerPoint - 05.pptx

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

PowerPoint Presentation

Microsoft Word - keisankigairon.ch doc

JAVA とテンプレート

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

アルゴリズムとデータ構造1

Prog1_6th

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

JavaプログラミングⅠ

Javaプログラムの実行手順

3,, となって欲しいのだが 実際の出力結果を確認すると両方の配列とも 10, 2, 3,, となってしまっている この結果は代入後の配列 a と b は同じものになっていることを示している つまり 代入演算子 = によるの代入は全要素のコピーではなく 先をコピーする ため 代入後の a と b は

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

アルゴリズムとデータ構造1

226

Microsoft PowerPoint - prog03.ppt

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

Microsoft PowerPoint - algo ppt [互換モード]

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft Word - no206.docx

PowerPoint プレゼンテーション

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

Java演習(4) -- 変数と型 --

DVIOUT-exer

JavaプログラミングⅠ

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

Microsoft PowerPoint - 7.pptx

Microsoft Word - 13

JavaプログラミングⅠ

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

基本情報STEP UP演習Java対策

Prog2_9th

PowerPoint Presentation

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft Word - java a.doc

Assignment_.java 課題 : 転置行列 / class Assignment_ public static void main(string[] args) int i,j; int[][] array = 1,,,,,,,,,,,,,1,1,; 行 列行列 i

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

Prog1_10th

JavaプログラミングⅠ

目 次 オブジェクト指向 1 3 オブジェクト指向 2 9 二分探索 14 二次元配列 16 ソート 18 ArrayList 25 解答 27 2

PowerPoint プレゼンテーション

大容量情報検索論

グラフの探索 JAVA での実装

JavaプログラミングⅠ

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

プログラミング基礎I(再)

二分木ヒープとは 集合 リストから 最小な 要素を取り出す 二分木ヒープは そのための標準的データ構造 二分木ヒープを保存するデータ構造 二分木ヒープの操作のメソッド 対象となるデータクラス 識別のためのlabelフィールド 値を保持するvalueフィールド

Transcription:

ジェネリクスとコンパレータを使用しない 2 分探索木のプログラム例 BinTreeNG.java: 2 分探索木のクラス BinTreeNG BinTreeTesterNG.java: BinTreeNG を利用するプログラム例 === BinTreeNG.java ========================================================================= // ジェネリクスを使用しない2 分探索木の例 // List.10-1 (pp.335-346) をジェネリクスおよびコンパレータを使用しない形に修正 // 主な修正点 // (1) BinTree<K,V> -> BinTreeNG // (2) Node の key を廃止 (Data 内のフィールド int no をキーとするため ) // メソッドの引数から K key を削除 // K -> int // (2) Node の data を Data クラスに固定 // class Data を簡略化して定義 (scandata, コンパレータを削除 ) // Node<K,V> -> Node // V -> Data // (3) メソッド search をキー毎に分離しコンパレータ不使用に // search() -> searchno(), searchname() // public class BinTreeNG { //--- データ ( 会員番号 + 氏名 ) ---// public static class Data { private Integer no; // 会員番号 private String name; // 氏名 Data(Integer no, String name) { // コンストラクタ this.no = no; this.name = name; //--- 文字列表現を返す ---// public String tostring() { return "(" + no + ") " + name; //--- キー値を返す ---// int getkey() { return no; //--- ノード ---// static class Node { private Data data; // データ private Node left; // 左子ノード private Node right; // 右子ノード //--- コンストラクタ ---//

Node(Data data, Node left, Node right) { this.data = data; this.left = left; this.right = right; //--- キー値を返す ---// int getkey() { return data.getkey(); //--- データを返す ---// Data getvalue() { return data; //--- データの表示 ---// void print() { System.out.println(data); private Node root; // 根 //--- コンストラクタ ---// public BinTreeNG() { root = null; //--- キーによる探索 ---// public Data searchno(int key) { Node p = root; // 根に着目 while (true) { if (p == null) // これ以上進めなければ return null; // 探索失敗 if(key == p.getkey()) // key とノード p のキーが等しければ return p.getvalue(); // 探索成功 if (key < p.getkey()) // key のほうが小さければ p = p.left; // 左部分木から探索 // key のほうが大きければ p = p.right; // 右部分木から探索 //--- node を根とする部分木にノード <K,V> を挿入 ---// private void addnode(node node, Data data) { if (data.getkey() == node.getkey()) return; // key は2 分探索木上に既に存在 if (data.getkey() < node.getkey()) { if (node.left == null) node.left = new Node(data, null, null);

addnode(node.left, data); // 左部分木に着目 { if (node.right == null) node.right = new Node(data, null, null); addnode(node.right, data); // 右部分木に着目 //--- ノードを挿入 ---// public void add(data data) { if (root == null) root = new Node(data, null, null); addnode(root, data); //--- キー値が key であるノードを削除 --// public boolean remove(int key) { Node p = root; // 走査中のノード Node parent = null; // 走査中のノードの親ノード boolean isleftchild = true; // p は parent の左子ノードか? while (true) { if (p == null) // これ以上進めなければ return false; // そのキー値は存在しない if (key == p.getkey()) // key とノード p のキー値を比較, 等しければ // 探索成功 { parent = p; // 枝をくだる前に親を設定 if (key < p.getkey()) { // key のほうが小さければ isleftchild = true; // これからくだるのは左の子 p = p.left; // 左部分木から探索 { // key のほうが大きければ isleftchild = false; // これからくだるのは右の子 p = p.right; // 右部分木から探索 if (p.left == null) { // p には左の子がない if (p == root) root = p.right; if (isleftchild) parent.left = p.right; // 親の左ポインタが右の子を指す parent.right = p.right; // 親の右ポインタが右の子を指す if (p.right == null) { // p には右の子がない if (p == root) root = p.left; if (isleftchild) parent.left = p.left; // 親の左ポインタが左の子を指す

parent.right = p.left; // 親の右ポインタが左の子を指す { parent = p; Node left = p.left; // 部分木の中の最大ノード isleftchild = true; while (left.right!= null) { // 最大ノード left を探索 parent = left; left = left.right; isleftchild = false; p.data = left.data; // left のデータを p に移動 if (isleftchild) parent.left = left.left; // left を削除 parent.right = left.left; // left を削除 return true; //--- node を根とする部分木のノードをキー値の昇順に表示 ---// private void printsubtree(node node) { if (node!= null) { printsubtree(node.left); // 左部分木をキー値の昇順に表示 System.out.println(node.data); // node を表示 printsubtree(node.right); // 右部分木をキー値の昇順に表示 //--- 全ノードをキー値の昇順に表示 ---// public void print() { printsubtree(root); ===========================================================================================

=== BinTreeTesterNG.java =================================================================== // ジェネリクスを使用しない2 分探索木クラス BinTreeNG の利用例 // BinTreeTester.java からの変更点 // Data クラスの定義を BinTreeNG に移動 // Data -> BinTreeNG.Data // 追加 を scandata() を用いないように修正 // 探索 をコンパレータ不使用の形に修正 // メニューに木の初期化を追加 import java.util.scanner; class BinTreeTester { static Scanner stdin = new Scanner(System.in); //--- メニュー列挙型 ---// enum Menu { ADD( " ノード挿入 "), REMOVE( " ノード削除 "), SEARCH( " ノード探索 "), PRINT( " 全データ表示 "), // *** ここに追加項目を挿入 INIT_TREE( " 初期化 "), // *** ここまで追加項目 TERMINATE(" 終了 "); private final String message; static Menu MenuAt(int idx) { for (Menu m : Menu.values()) if (m.ordinal() == idx) return m; return null; // 木を作成 // 表示用文字列 // 序数が idx である列挙を返す Menu(String string) { message = string; String getmessage() { return message; // コンストラクタ // 表示用文字列を返す //--- メニュー選択 ---// static Menu SelectMenu() { int key; do { for (Menu m : Menu.values()) { System.out.printf("(%d) %s ", m.ordinal(), m.getmessage()); if ((m.ordinal() % 3) == 2 && m.ordinal()!= Menu.TERMINATE.ordinal()) System.out.println();

System.out.print(":"); key = stdin.nextint(); while (key < Menu.ADD.ordinal() key > Menu.TERMINATE.ordinal()); return Menu.MenuAt(key); public static void main(string[] args) { Menu menu; // メニュー BinTreeNG.Data data; // 追加用データ参照 BinTreeNG.Data ptr; // 探索用データ参照 Integer no; // 番号 ( 追加 検索用 ) String name; // 名前 ( 追加 検索用 ) BinTreeNG tree = new BinTreeNG(); do { switch (menu = SelectMenu()) { case ADD : // ノードの挿入 System.out.println(" 挿入するデータを入力して下さい."); System.out.print(" 番号 :"); no = stdin.nextint(); System.out.print(" 名前 :"); name = stdin.next(); data = new BinTreeNG.Data(no, name); tree.add(data); case REMOVE : // ノードの削除 System.out.println(" 削除するデータを入力して下さい."); System.out.print(" 番号 :"); no = stdin.nextint(); tree.remove(no); case SEARCH : // ノードの探索 System.out.println(" 探索するデータを入力して下さい."); System.out.print(" 番号 :"); no = stdin.nextint(); ptr = tree.searchno(no); if (ptr!= null) System.out.println(" その番号の氏名は " + ptr + " です "); System.out.println(" 該当データはありません "); case PRINT : tree.print(); // 全ノードをキー値の昇順に表示 case INIT_TREE: // 木を初期化 data = new BinTreeNG.Data(1, " 武田信玄 "); tree.add(data); data = new BinTreeNG.Data(2, " 上杉謙信 "); tree.add(data); data = new BinTreeNG.Data(3, " 織田信長 "); tree.add(data); data = new BinTreeNG.Data(4, " 豊臣秀吉 "); tree.add(data); data = new BinTreeNG.Data(5, " 徳川家康 "); tree.add(data);

while (menu!= Menu.TERMINATE); ===========================================================================================