、およびすべてのその楽しいもの。問題は、私は本当にすべてをよく理解していないということです。私は再帰の一般的な概念を理解していますが、プログラムを作成するときにそれを実践することは私にとってとても複雑に感じます。私はそれが典型的な方法を何度も呼び出しているということを知っています。それは終了時の基本的なケースに到達しますが、私がしたいコードを書くのは難しいです。
私たちは現在、バイナリツリーに取り組んでいます。教授が提供するコードを使用してツリーを分割し、そのツリーに含まれるすべてのパスを出力する再帰的メソッドを作成する必要があります。
a
b c
B、Cがその下0人の子供を持っているでしょう:私たちの入力は、ツリーのだろう(a(b()())(c()()))
ようなものになります。 (a)
は可能なノードであり、()
はそのパスの終わりとなる空のノードになります。私たちの目標は、私の例では、出力は次のようになりますので、すべてのパスをプリントアウトすることです:
a b
a c
我々が与えられたコードは、我々は再帰的なメソッドを記述するために使用できるヘルパーメソッドが含まれています
public class BinaryTree {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String tree = scan.nextLine();//correct format : (a()())
String[] t = splitTree(tree);
System.out.println(Arrays.toString(t));
}
public static String[] splitTree(String tree)
{
//expected format
//(node tree tree)
//0 1 2-x x-(length-2) length-1
if(tree.length() <= 2)//tree not long enough to process
return new String[]{tree};
String[] temp = new String[3];
temp[0] = "" + tree.charAt(1);//grab tree node
tree = tree.substring(2, tree.length()-1);//remove node and outer paren
int parenCount = 0;//count of open paren
int endTreeOne = 0;//end of first tree
for(int i = 0; i < tree.length(); i++)
{
if(tree.charAt(i) == '(')
parenCount++;
if(tree.charAt(i) == ')')
parenCount--;
if(parenCount == 0)
{
endTreeOne = i;
break;//ends for loop early
}
}
temp[1] = tree.substring(0, endTreeOne+1);//left tree
temp[2] = tree.substring(endTreeOne+1);//right tree
return temp;
}
このメソッドは、基本的に(a(b()())(c()()))
のような文字列を変換し、[a, (b()()), (c()())]
にします。基本的にツリーを分割する。
私は再帰的メソッドを書くためにここからどのように進めるのか分かりません。私はかなり正直に失われた(と結果として)失望した。私は "()"が存在するかどうかをチェックする必要があると思っています。それがパスの終わりです。それが私が必要とするループから脱出する私の基本的なケースでしょうか?ツリーのどの辺を取るかを指定する方法がわかりません。誰かが何か助けやヒントを提供したり、これに取り組むための思考の正しい列車に乗ってくれたら、私はそれを高く評価します。私の再帰的な方法について
static ArrayList<String> path = new ArrayList<>();
public static String treePaths(String s)
{
String[] split = splitTree(s);
if(split[1].equals("()") && split[2].equals("()"))
{
path.add(split[0].toString());
System.out.println(path.toString());
return split[0];
}
else
{
String s2 = "";
for(int i = 0; i < split.length-1; i++)
{
s2 = split[i].toString();
}
path.add(split[0].toString());
return treePaths(s2);
}
を、私はそれがすでに間違っているかなり確信している:
これまでのところ、私は本当にただ(上記のヘルパーメソッドに加えて)持っています。誰かが助けを与えることができれば(特に私の教授が提供するコードを使用すると)、私は非常に感謝しています。(私が正しい方向に向いているか、ここでは、私はそれが私はそれを行う必要があった方法が完了しているかどうかはわかりません
私は、パスを保存するためにarraylistを使用することになっていると思います。うーん.. – ViviO