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

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

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

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

Q&A

解決済

1回答

1480閲覧

AOJの根付き木の表現問題をJavaで実装するとRunTimeErrorとなってしまう

ametyan

総合スコア43

Java

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

0グッド

0クリップ

投稿2020/04/16 02:42

AOJで根付き木の表現問題(下記URL参照)をJavaで実装するとテストケース7で、RuntimeErrorとなってしまいます。
何が原因なのか分からなく、どこを直せばエラーにならなくなりますか?
また、今回のようなRuntimeErrorが出た場合の調査方法(ツールを使うなど)があれば教えていただきたいです。

Rooted Trees

import java.util.Scanner; public class Main { private static int d[] = new int[100005]; private static Node t[] = new Node[100005]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for (int i = 0; i < n; i++) { t[i] = new Node(); } int l = 0; for (int i = 0; i < n; i++) { int id = sc.nextInt(); int k = sc.nextInt(); for (int j = 0; j < k; j++) { int c = sc.nextInt(); if (j == 0) { t[id].left = c; } else { t[l].right = c; } l = c; t[c].parent = id; } } int r = 0; for (int i = 0; i < n; i++) { if (t[i].parent == -1) r = i; } rec(r, 0); StringBuilder ans = new StringBuilder(); for (int i = 0; i < n; i++) { ans.append("node ").append(Integer.toString(i)).append(": parent = ").append(Integer.toString(t[i].parent)) .append( ", depth = ").append(Integer.toString(d[i])).append(", "); if (d[i] == 0) { ans.append("root, "); } else if (t[i].left == -1) { ans.append("leaf, "); } else { ans.append("internal node, "); } ans.append("["); int c = t[i].left; while (c != -1) { if (c != t[i].left) { ans.append(", "); } ans.append(Integer.toString(c)); c = t[c].right; } ans.append("]\n"); } System.out.print(ans.toString()); sc.close(); } private static void rec(int i, int p) { d[i] = p; if (t[i].left != -1) rec(t[i].left, p + 1); if (t[i].right != -1) rec(t[i].right, p); } } class Node { int parent; int left; int right; Node() { this.parent = -1; this.left = -1; this.right = -1; } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらくrecでスタックオーバーフローが起きてるんでしょう

大抵の場合大きなデータでないと起こらないのでツールを使ってもなかなか判断しづらいところです。
エラーメッセージやそれを起こすテストケースがわかるならそれを見れば一発ですが、わからない場合には再帰関数を使ってる部分に注意するぐらいしか方法はありません。

投稿2020/04/16 04:24

yudedako67

総合スコア2047

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

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

ametyan

2020/04/16 04:42

ご回答ありがとうございます。ご指摘の通り、スタックオーバーフローが原因のようでした。 再帰ではなく、各ノードに対して深さを取得するよう修正したところ通りました。 private static int getDepth(int i) { int d = 0; while (t[i].parent != -1) { i = t[i].parent; d++; } return d; }
dodox86

2020/04/16 07:06

ちなみにテストケースは確認できるはずです。Last 100 Submissions(http://judge.u-aizu.ac.jp/onlinejudge/submission.jsp)で自分のRun# をクリックして出た画面で「テストケース」が出ます。テストケースをファイルでダウンロードして標準入力から入れれば、ローカルでデバッグ/テストできます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問