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

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

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

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

Q&A

解決済

2回答

1290閲覧

再帰関数でStringBuilder型の変数に文字を追加していって文字列を作りたい

K.M.PEANUTS

総合スコア40

Java

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

0グッド

0クリップ

投稿2021/12/21 02:29

編集2021/12/21 03:01

java

1public class Node { 2 3 public String expression; // このノードが表す式(二分木への分割後は演算子または項となる) 4 public Node left = null; // 左の子ノード 5 public Node right = null; // 右の子ノード 6 public StringBuilder rt = new StringBuilder(""); 7 public String rt_expression; //後置記法の式 8 9public void traversePostorder() 10 { 11 // 左右に子ノードをもつ場合、表示する前にノードを再帰的に巡回する 12 if (left != null) 13 left.traversePostorder(); 14 if (right != null) 15 right.traversePostorder(); 16 17 //rtにexpressionを追加していって後置記法の数式を完成させる 18 this.rt.append(expression); 19 // 巡回を終えた後でノードの演算子または項を表示する 20 // (読みやすさのために項の後に空白を補って表示する) 21 System.out.print(expression + " "); 22 } 23 24public String getRtExpression() { 25 this.rt_expression = this.rt.toString(); 26 return this.rt_expression; 27 } 28 29}

困っていること

現在、中置記法の数式を後置記法の式に直して計算するコードを書いています。
そのコードの一部で、上のコードは、中置記法の式から二分木を作ったものを後順走査でたどってStringBuilder型のrtに代入していき、完成した後置記法の式"rt"をフィールドのrt_expressionに代入しているところです。
しかし、このメソッドを実行した後にrt_expressionを画面表示すると、最後に代入された文字しか表示されません(+のみなど)。おそらく毎回1文字ずつ上書きされてしまっているのですが、どのように改善すれば良いのか教えてください。

ちなみに、this.rt_expression = rt.toString();の1文も毎回実行されるのは良くないと理解しているので、こちらも良い書き方を教えてくれたら嬉しいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

最初に traversePostorder を呼び出すときの引数 "" にどんどん追加していけばよいのではありませんか?

Java

1class Node { 2 public String expression; // 演算子または項 3 public Node left = null; // 左の子ノード 4 public Node right = null; // 右の子ノード 5 6 Node(String e) { expression = e; } 7 Node(String e, Node l, Node r) { expression = e; left = l; right = r; } 8 9 public String traversePostorder(String rt) { 10 if (left != null) rt = left.traversePostorder(rt); 11 if (right != null) rt = right.traversePostorder(rt); 12 return rt + expression + " "; 13 } 14} 15 16class Main { 17 public static void main(String args[]) { 18 Node root = new Node("+", 19 new Node("*", new Node("a"), new Node("b")), 20 new Node("c") 21 ); // a * b + c 22 System.out.println(root.traversePostorder("")); 23 } 24}

実行結果

text

1a b * c +

追記
StringBuilder に追加していきたいのなら、

Java

1class Node { 2 public String expression; // 演算子または項 3 public Node left = null; // 左の子ノード 4 public Node right = null; // 右の子ノード 5 6 Node(String e) { expression = e; } 7 Node(String e, Node l, Node r) { expression = e; left = l; right = r; } 8 9 public void traversePostorder(StringBuilder rt) { 10 if (left != null) left.traversePostorder(rt); 11 if (right != null) right.traversePostorder(rt); 12 rt.append(expression + " "); 13 } 14} 15 16class Main { 17 public static void main(String args[]) { 18 Node root = new Node("+", 19 new Node("*", new Node("a"), new Node("b")), 20 new Node("c") 21 ); 22 StringBuilder sb = new StringBuilder(); 23 root.traversePostorder(sb); 24 System.out.println(sb); 25 } 26}

投稿2021/12/21 03:04

編集2021/12/21 03:10
kazuma-s

総合スコア8224

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

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

0

おそらく毎回1文字ずつ上書きされてしまっているのですが

違います。メソッド内のローカル変数は、実行のたびに作成されますので、最初に呼び出された時のStringBuilder rtと、left.traversePostorder()内でのStringBuilder rtは別物になっています。

ということで、leftrightでの実行結果はStringBuilder rtに影響を及ぼすことはなく、 rt.append(expression)の結果だけが出力されます。

投稿2021/12/21 02:43

maisumakun

総合スコア146018

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

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

K.M.PEANUTS

2021/12/21 03:04

原因を理解できましたありがとうございます! 改善策としてStringBuilder rtをフィールドにしたのですが、実行結果が変わりませんでした。これは何故でしょうか?
maisumakun

2021/12/21 03:10

> 改善策としてStringBuilder rtをフィールドにしたのですが leftもrightも別インスタンスなので、やはりrtは別物です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問