Я очень застрял. Я понимаю рекурсию, но этот проект потерял меня.Как преобразовать это двоичное дерево с помощью рекурсии?
В основном, это дерево берет что-то вроде
(a(b()())(c(d()())()))
и выходов
a b
a c d
Это, как говорится, каждый узел может иметь 0, 1 или 2-х детей. Поэтому, если узел содержит 0 дочерних элементов, я знаю, что это означает, что пришло время для рекурсии предпринять действие & вернуться к корню дерева и перейти в правую часть дерева (потому что он сначала читает левую сторону). В целом, я просто очень смущен.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class BinaryTreeFinal {
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));
//System.out.println(tree2("a", "(a(b()())(c(d()())()))"));
}
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;
}
Это когда код становится грязным:
public static char tree2(String root, String path)
{
int counter = 0;
String[] trees = splitTree(path);
if(trees[1].charAt(counter) == '(' && trees[1].charAt(counter++) == ')')
{
counter++;
//return trees[1].charAt(counter);
return tree2(String, String);
//System.out.println(trees[1].charAt(counter));
}
else
//System.out.println(trees[1].charAt(counter));
return trees[1].charAt(counter);
//counter++;
}
Большое спасибо, и мне очень жаль, что это сбивает с толку. Я не знаю, как это сказать.
Есть ли причина, по которой вам нужно использовать двоичное дерево здесь? Просто любопытно. –
Мой профессор требует здесь двоичного дерева. – HelpMe
Ах! Ха-ха, я делал «стековый» подход. Обновления скоро :) –