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

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

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

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

Q&A

解決済

2回答

1055閲覧

Java バイナリツリーの垂直での出力方法

ladyinredjes

総合スコア12

Java

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

0グッド

0クリップ

投稿2019/03/08 09:06

編集2019/03/08 11:38

発生している問題・エラーメッセージ

前提・実現したいこと

バイナリツリーの垂直での出力方法に悩んでいます。
プリントクラスのコードがわかりません。
サンプルの出力は以下です。

イメージ説明

Java

1public class Node<T extends Comparable<T>> { 2 T value; 3 Node<T> left, right; 4 5 public void insertToTree(T v) { 6 if (value == null) { 7 value = v; 8 return; 9 } 10 if (v.compareTo(value) < 0) { 11 if (left == null) { 12 left = new Node<T>(); 13 } 14 left.insertToTree(v); 15 } else { 16 if (right == null) { 17 right = new Node<T>(); 18 } 19 right.insertToTree(v); 20 } 21 } 22 23 public void printTree(OutputStreamWriter out) throws IOException { 24 if (right != null) { 25 right.printTree(out, true, ""); 26 } 27 printNodeValue(out); 28 if (left != null) { 29 left.printTree(out, false, ""); 30 } 31 } 32 private void printNodeValue(OutputStreamWriter out) throws IOException { 33 if (value == null) { 34 out.write("<null>"); 35 } else { 36 out.write(value.toString()); 37 } 38 out.write('\n'); 39 } 40 // use string and not stringbuffer on purpose as we need to change the indent at each recursion 41 private void printTree(OutputStreamWriter out, boolean isRight, String indent) throws IOException { 42 if (right != null) { 43 right.printTree(out, true, indent + (isRight ? " " : " | ")); 44 } 45 out.write(indent); 46 if (isRight) { 47 out.write(" /"); 48 } else { 49 out.write(" \"); 50 } 51 out.write("----- "); 52 printNodeValue(out); 53 if (left != null) { 54 left.printTree(out, false, indent + (isRight ? " | " : " ")); 55 } 56 } 57 58}

のコードはエラーが出ていないので合っていると思いますが、出力の際のコードがどうしてもわかりません。

試したこと

試したのは以下のプリントクラスコードです。

java

1 private static Node<Integer> Tree() { 2 Node<Integer> root = new Node<Integer>(99); 3 Node<Integer> n1 = new Node<Integer>(97); 4 Node<Integer> n2 = new Node<Integer>(92); 5 Node<Integer> n3 = new Node<Integer>(83); 6 Node<Integer> n4 = new Node<Integer>(72); 7     ・ 8     ・ 9     ・ 10      11 root.left = n1; 12 root.right = n2; 13 14 n1.left = n2; 15 n1.right = n3; 16  ・ 17     ・ 18     ・

java

1public static void main(String[]args){ 2 binarytree b1=new binarytree(); 3 4 b1.root=new Node(2); 5 6 b1.root.left=new Node(1); 7 b1.root.right=new Node(5); 89     ・ 10     ・

どちらもエラーとなりました。
様々なサイトを見て試してみましたがどうしても理解できません。

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

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

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

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

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

momon-ga

2019/03/08 12:26 編集

ごめんなさい。「プリントクラスのコードがわからない」の意味がわからないです・・・ もう少し適格に状況を質問に補足してもらえないでしょうか プリントクラスとは?なんですか? コードがわからない。とは、どういう状態ですか? > 様々なサイトを見て試してみましたがどうしても理解できません。 ・参考にしている?ソースのロジックがわからない ・出力するロジックが書けない? ・出力するロジックは書いた(コンパイルエラーはでない)けど、呼び方がわからない? > どちらもエラーとなりました。 そもそもエラーになるとは、どういう状態?(例外が発生した?)
ladyinredjes

2019/03/08 12:34

値を挿入するコードがわからないという意味です。 下の2つのコードが値を挿入しているクラスのコードです。 この二つだと出力するメソッドが呼び出せず、コンパイルエラーとなってしまいます。 わかりずらく、申し訳ありません。
jimbe

2019/03/08 12:52

「サンプルのように表示されるためにツリー構造を作る部分が分からない」ということでしょうか.
ladyinredjes

2019/03/08 12:53

そうです。ありがとうございます。
jimbe

2019/03/08 12:55

ということは, Node クラスは修正せずにこのまま使うのでしょうか.
ladyinredjes

2019/03/08 12:57

今の所エラーがないのでつかえれば良いですが、そもそもNodeクラスのコード自体が間違っているのでしょうか?
jimbe

2019/03/08 13:04 編集

それはまだ試しておりませんので分かりませんが, 少なくともサンプルには無い「|」や「/」, 「<null>」等が表示されるかのようになっています. ツリー構造さえ合っていれば, これらは有っても無くても構わないということでよいのでしょうか. また, もし Node クラスの表示に不都合があれば, 修正しても良いのでしょうか.
ladyinredjes

2019/03/08 13:05

一応構造が理解しやすいかなと思い、そのまま残しているだけなので気にされなくて大丈夫です。 はい。ありがとうございます。
guest

回答2

0

ベストアンサー

「サンプルのように表示されるためにツリー構造を作る部分が分からない」ということでしたので, main を含む BTree クラスとしてツリーの生成・表示を行うコードを起しました.
なお, Node クラスの printTree (及びその下位メソッド) が OutputStreamWriter.write に出力していましたが, 直接表示するよう PrintStream.print に変更致しましたうえでのコードとなります.

java

1public class BTree { 2 public static void main(String[] args) throws IOException { 3 int[] values = { 49, 83, 97, 99, 92, 71, 72, 69, 28, 40, 44, 32, 18, 19, 11 }; 4 5 Node<Integer> tree = new Node<>(); 6 for(int v : values) tree.insertToTree(v); 7 8 tree.printTree(System.out); 9 } 10}

Node クラスは, insertToTree メソッドにより, 自身の値の設定 及び その値との比較によって左右に振り分けての下位構造の生成 は致しますが, バランスは取らないので, 生成する順に値を渡す必要があります.

投稿2019/03/08 13:33

jimbe

総合スコア12632

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

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

ladyinredjes

2019/03/08 14:12

できました。本当にありがとうございました(TT)
jimbe

2019/03/08 14:45

Node クラスにはメソッドは4つしかありません. そのうち3つは表示にしか関係しませんので, Nodeの機能の中心は20行にも満たない1つのメソッドのみです. せめて, その1つのメソッドをしっかりとご理解頂いてから, コードをお書きになったほうが良いかと思います. でなければ, エラーになったという2つのメソッドを書くのにも多少ともお時間がかかったことでしょうに, ムダになってしまいます.
guest

0

あまりソース読んでないので、アイデアだけというか、大抵の人が考えそうなやりかただと。
サンプルのように出したいなら。

・より上側に表示するノードの存在確認(右ノード) // 1
存在した場合、インデントを増やして、その右ノードの表示処理
・自分自身の表示処理 // 2
より下側に表示するノードの存在確認(左ノード) // 3
・存在した場合、インデントを増やして、その左ノードの表示処理

を、再帰的に呼べばええんじゃないかと。

イメージ

java

1public void printNode(Node n, String indent) { 2 // 1 3 if(n.right != null) { 4 printNode(n.right, indent + " "); 5 } 6 // 2 7 System.out.println(indent + n.value); 8 // 3 9 if(n.left != null) { 10 printNode(n.left, indent + " "); 11 } 12}

投稿2019/03/08 10:39

momon-ga

総合スコア4820

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

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

ladyinredjes

2019/03/08 11:40

回答ありがとうございます。ただ、出力の際のプリントクラスのコードがわからなくて...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問