質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2181閲覧

二分探索木でtraverse()を用いて木のバランスの悪さをはかりたいです。

karasu116

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/10/07 07:03

二分探索木の(図にしたときの)バランスをはかる指標をunbalance度とします。
unbalance度の定義はあるノードにおける右の子の合計数と左の子の合計数の差の絶対値です。
各ノードにおけるunbalance度の最大値をその探索木のunbalance度とします。イメージ説明

青字で表したのが各ノードにおけるunbalance度で、緑字で表したのが各ノードにおけるそれぞれ左の子の合計数と右の子の合計数です。

java

1package genericSearch; 2 3import java.util.AbstractMap; 4import java.util.Comparator; 5import java.util.Iterator; 6import java.util.Map; 7import java.util.Random; 8import java.util.Scanner; 9 10 11public class StringSearch2 { 12 //テスト用のmainメソッド 13 @SuppressWarnings("resource") 14 public static void main( String [ ] args ) { 15 //データ型がString型である空の2分探索木を作る. 16 VisitableBinSearchTree2<Integer,String> tree = 17 new VisitableBinSearchTree2<Integer,String>( 18 new Comparator<Integer>() { 19 public int compare(Integer a, Integer b) { 20 return a - b ; 21 } 22 } 23 ) ; 24 25 //1,2,..,nのランダムな順列を生成する 26 int n ; 27 Scanner keyboard = new Scanner(System.in) ; 28 System.out.println("#strings:") ; 29 n = keyboard.nextInt(); 30 int[] array = new int[n] ; 31 for (int i = 0 ; i < n ; i++) 32 array[i] = i + 1; 33 Random rand = new Random() ; 34 for (int i = 0 ; i < n ; i++) { 35 int j = rand.nextInt(n - i) ; 36 int temp = array[n - 1 - i] ; 37 array[n - 1 - i] = array[j] ; 38 array[j] = temp ; 39 } 40 41 //上記の木にn個のデータを,生成したランダム順に挿入 42 for (int i = 0 ; i < n ; i++) { 43 //System.out.print(array[i] + " "); 44 tree.insert(new AbstractMap.SimpleEntry<Integer,String>(array[i], i + "-th string")); 45 } 46 47 //木の高さを求める 48 tree.accept(new BTVisitor<Integer,String>() { 49 public Integer visitNull() { 50 return 0 ; 51 } 52 public Integer visitNode(Object left, Object right, Map.Entry<Integer,String> data) { 53 return Math.max((Integer)left, (Integer)right) + 1 ; 54 } 55 }); 56 System.out.println("height: " + (Integer)tree.traverse()); 57 System.out.println("") ; 58 59 //unbalance: 60 tree.accept(new BTVisitor<Integer,String>() { 61 public int[] visitNull() { 62 return new int[] {0, 0, 0}; 63 } 64 public int[] visitNode(Object left,Object right,Map.Entry<Integer,String> data) { 65 66 //ここに処理を記述 67 } 68 }); 69 System.out.println("unbalance度:"+ (Integer)tree.traverse()); 70 71 //postorder順に木をたどる. 72 System.out.println("visiting the tree in post order"); 73 tree.accept(new BTVisitor<Integer,String>() { 74 public Void visitNull( ) { 75 return null ; 76 } 77 public Void visitNode(Object left, Object right, Map.Entry<Integer,String> data) { 78 System.out.println(data.getKey() + ":" + data.getValue()); 79 return null ; 80 } 81 }); 82 tree.traverse(); 83 84 //検索と削除操作をテスト 85 int m = rand.nextInt(n) ; 86 System.out.println("trying to find " + m + " ..."); 87 String result = tree.search(m) ; 88 if (result != null) { 89 System.out.println("found " + m + ":" + result) ; //結果表示 90 System.out.println("") ; 91 System.out.println("trying to delete " + m + " ..."); 92 tree.delete(m); //削除 93 result = tree.search(m) ; 94 if (result != null) 95 System.out.println("Error: found the deleted data.") ; 96 } 97 System.out.println("") ; 98 99 //木にあるデータをキーの小さい順に表示する別の方法. 100 Iterator<Map.Entry<Integer,String>> iter = tree.inorderIterator() ; 101 System.out.println("data in sorted order:"); 102 while (iter.hasNext()) { 103 Map.Entry<Integer,String> d = iter.next(); 104 System.out.println(d.getKey() + ":" + d.getValue()); 105 } 106 } 107} 108

java

1package genericSearch; 2 3import java.util.Comparator; 4import java.util.Map; 5 6//Kはデータのキーの型,Vはデータの値の型 7public class VisitableBinSearchTree2<K,V> extends BinSearchTree<K,V> 8 implements BTAcceptor<K,V> { 9 private BTVisitor<K,V> visitor ; 10 11 //引数ありのコンストラクタ 12 public VisitableBinSearchTree2(Comparator<K> comparator) { 13 super(comparator) ; 14 } 15 16 //Visitorを引き受けるメソッド. 17 public void accept(BTVisitor<K,V> visitor) { 18 this.visitor = visitor ; 19 } 20 21 22 //木全体を処理するメソッド 23 public Object traverse( ) { 24 return traverse(getRoot()) ; 25 } 26 27 //木の指定ノードstartを根とする部分木を処理するメソッド 28 private Object traverse(BinSearchTreeNode<K,V> start) { 29 if (start == null)//空の木であるとき 30 return visitor.visitNull(); 31 else {//空ではない木のとき 32 Object left = traverse(start.getLeft()) ; 33 Object right = traverse(start.getRight()) ; 34 return visitor.visitNode(left, right, start.getData()); 35 } 36 } 37} 38

java

1package genericSearch; 2 3import java.util.Map; 4 5//Kはデータのキーの型,Vはデータの値の型 6public class BinSearchTreeNode<K,V> { 7 private Map.Entry<K,V> data ; 8 private BinSearchTreeNode<K,V> left, right ; 9 10 //コンストラクタ 11 public BinSearchTreeNode(Map.Entry<K,V> data, BinSearchTreeNode<K,V> left, 12 BinSearchTreeNode<K,V> right) { 13 this.data = data ; 14 this.left = left ; 15 this.right = right ; 16 } 17 18 //葉を作るためのコンストラクタ 19 public BinSearchTreeNode(Map.Entry<K,V> data) { 20 this(data, null, null) ; 21 } 22 23 //葉か否かを判定するメソッド 24 public boolean isLeaf() { 25 return left == null && right == null ; 26 } 27 28 29 //accessorメソッド 30 public Map.Entry<K,V> getData() { 31 return data ; 32 } 33 public BinSearchTreeNode<K,V> getLeft() { 34 return left ; 35 } 36 public BinSearchTreeNode<K,V> getRight() { 37 return right ; 38 } 39 public void setData(Map.Entry<K,V> data) { 40 this.data = data ; 41 } 42 public void setLeft(BinSearchTreeNode<K,V> left) { 43 this.left = left ; 44 } 45 public void setRight(BinSearchTreeNode<K,V> right) { 46 this.right = right ; 47 } 48} 49

java

1package genericSearch; 2 3import java.util.Map; 4 5public interface BTVisitor<K,V> { 6 //nullを処理して値を返すためのメソッド 7 public abstract Object visitNull( ); 8 9 //あるノードにあるデータdata,そのノードの左の部分木を処理した結果leftValue, 10 //およびそのノードの右の部分木を処理した結果rightValueから,そのノードを 11 //処理した結果を返すためのメソッド 12 public abstract Object visitNode(Object leftValue, Object rightValue, Map.Entry<K,V> data) ; 13}

treverce()メソッドが探索木を再帰的にたどっていくので、その過程にあるノードにおいて左の子がいれば左の子の個数を覚えておく変数に1を加えて、右の子がいる場合も同様に右の子の個数を覚えておく変数に1を加えてあげればいいと思いました。
これらの変数の差の絶対値がそのノードにおけるunbalance度になり、全てのノードの中で最も大きいunbalance度を返すようにすればいいと思いました。

大学の資料では最初のファイルにある通りint型の配列を用いれば比較的簡単にうまくいくと書いてあったのですがint型の配列を戻り値とする利点は何なのでしょうか? ここでの配列の利用の仕方を教えて下さい。 また整数としてのunbalance度を取得するためにはどうしたらいいのでしょうか?

単純にキャストするしか方法が思いつかなかったのですが他に方法はありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/10/07 07:54 編集

疑問点がわからないですが、「int型の配列を用いれば比較的簡単にうまくいく」という文には"戻り値"という語はありません。「int型の配列を戻り値とする」はどこからでてきましたか? 前後の文ですか? "コードがそうなってるから"ということであればこのままでもいいですが、前後の文からだったらその辺りも書いた方がいいかと思いました。
guest

回答1

0

ベストアンサー

質問者様、写真の図だけでは何がなにを指し示すのか理解できません。

青字で表したのが各ノードにおけるunbalance度で、緑字で表したのが各ノードにおけるそれぞれ左の子の合計数と右の子の合計数です。

この図の例だと「アンバランス度」がよくわからないです。
例としてなら
「投入ノード10に対して3:7に2分木ノード分割した際 7 - 3 = 4 がアンバランス度となる。」
だと思うのですが?

unbalance度の定義はあるノードにおける右の子の合計数と左の子の合計数の差の絶対値です。

これは各ノードにおける左右の数値さえわかれば良いので

各BinSearchTreeNodeのLeftとRightの配列数から求めれば良いだけでは?

投稿2020/10/07 10:54

編集2020/10/07 12:07
kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問