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

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

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

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

Q&A

1回答

1660閲覧

AOJ ALDS1-ALDS1_7-A Tree - Rooted Treesでランタイムエラー java言語

kimura_masaya

総合スコア14

Java

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

0グッド

0クリップ

投稿2016/09/21 05:41

編集2016/09/21 05:50

AOJ ALDS1-ALDS1_7-A
Tree - Rooted Trees
以下の移植分について・・⓵
ランタイムエラーが出るため
その原因を探しています。
分かる方お願いします。

最下部に他の人の正解解答も記しておきます。・・⓶

-------------⓵本を参考にC++からjavaに移植したもの----------------------

package RootedTrees;

import java.io.;
import java.util.
;

class Node{
int p,l,r;
}

class Main{
//in
static final int MAX=100005;//5?
static final int NIL=-1;

public static Node[] T=new Node[MAX]; public static int n=0; //contains public static int[] D= new int[MAX]; //public static boolean publicflg = false; //notes //out static final String ForStrLength="node : "+"parent = , "+"depth = , "+"internal node, [, , ]"; public static StringBuilder OutPrint = new StringBuilder(ForStrLength.length()+2+String.valueOf(MAX).length()*(2+MAX)); public static void main(String[] args) throws IOException{ int i,j,d,v,c,l=0,r=0; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; n=Integer.parseInt(br.readLine()); for(i=0;i<n;i++){ T[i]=new Node(); T[i].p=T[i].l=T[i].r=NIL; } for(i=0;i<n;i++){ st=new StringTokenizer(br.readLine()); v=Integer.parseInt(st.nextToken()); d=Integer.parseInt(st.nextToken()); for(j=0;j<d;j++){ c=Integer.parseInt(st.nextToken()); if(j==0)T[v].l=c; else T[l].r=c; l=c; T[c].p=v; } } for(i=0;i<n;i++){ if(T[i].p==NIL)r=i; } rec(r,0); for(i=0;i<n;i++)print(i); } public static void rec(int u,int p){ D[u]=p; if(T[u].r!=NIL)rec(T[u].r,p); if(T[u].l!=NIL)rec(T[u].l,p+1); } public static void print(int u){ int i,c; OutPrint.append("node "+u+": "); OutPrint.append("parent = "+T[u].p+", "); OutPrint.append("depth = "+D[u]+", "); if(T[u].p==NIL)OutPrint.append("root, "); else if(T[u].l==NIL)OutPrint.append("leaf, "); else OutPrint.append("internal node, "); OutPrint.append("["); for(i=0,c=T[u].l;c!=NIL;i++,c=T[c].r){ if(i>0)OutPrint.append(", "); OutPrint.append(c); } OutPrint.append("]"); System.out.println(OutPrint); OutPrint.setLength(0); }

}

-----------------------------他者の正解解答------------------------------------------

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {

public static void main(String[] args) throws NumberFormatException, IOException { new Main().run(); } private void run() throws NumberFormatException, IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(reader.readLine()); Node[] T = new Node[n]; for (int i = 0; i < n; i++) { T[i] = new Node(); } int l = 0; for (int i = 0; i < n; i++) { StringTokenizer tokenizer = new StringTokenizer(reader.readLine()); int v = Integer.parseInt(tokenizer.nextToken()); T[v].id = v; int d = Integer.parseInt(tokenizer.nextToken()); for (int j = 0; j < d; j++) { int c = Integer.parseInt(tokenizer.nextToken()); if (j == 0) { T[v].l = c; } else { T[l].r = c; } l = c; T[c].p = v; } } int r = -1; for (int i = 0; i < n; i++) { if (T[i].p == -1) { r = i; break; } } int[] D = new int[n]; rec(r, 0, D, T); StringBuilder builder = new StringBuilder(); for (int i = 0; i < n; i++) { print(i, T, D, builder); } System.out.print(builder); } private void print(int u, Node[] T, int[] D, StringBuilder builder) { builder.append("node ").append(u).append(": parent = ").append(T[u].p) .append(", depth = ").append(D[u]).append(", "); if (T[u].p == -1) builder.append("root, "); else if (T[u].l == -1) builder.append("leaf, "); else builder.append("internal node, "); builder.append("["); for (int i = 0, c = T[u].l; c != -1; i++, c = T[c].r) { if (i != 0) builder.append(", "); builder.append(c); } builder.append("]\n"); } private void rec(int u, int p, int[] D, Node[] T) { Deque<Node> deque = new ArrayDeque<Node>(); deque.offer(T[u]); while (!deque.isEmpty()) { int t = deque.size(); for (int i = 0; i < t; i++) { Node node = deque.poll(); D[node.id] = p; if (node.l != -1) { node = T[node.l]; while (true) { deque.offer(T[node.id]); if (node.r != -1) { node = T[node.r]; } else { break; } } } } p++; } } class Node { int id = -1; int p = -1; int l = -1; int r = -1; }

}

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

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

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

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

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

guest

回答1

0

recメソッドの部分で再帰しすぎて
スタックオーバーフローエラーが出てるのを確認しました。
他者さんの解答を参考に再帰への別対応を
考えていきます。

投稿2016/09/21 09:35

編集2016/09/21 09:47
kimura_masaya

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問