思路:关键是输入怎么存储,这里使用一个buf[][]二维数组存储的,这样做的好处是,可以跨行查询,也就是说
我们要判断一个字母是否拥有子树,那就要查询它正下方是否是一个‘|’字符,这里就需要跨行查询
然后再跨行找到”---------------------“,再跨行找到”----------------“下面的字母,对每个字母调用递归函数即可
package test;
import java.util.Scanner;
public class Test{
static Scanner sc = new Scanner(System.in);
static String line;
static int n = 20;
static char[][] buf = new char[n][n];//存储输入的树
/**
* 字母的横纵坐标
* @param r
* @param c
*/
static void build(int r, int c){
System.out.print(buf[r][c]+"(");
if(r+1 <n && buf[r+1][c]=='|'){//没有越界,并且有子树
int i = c;
while(i>0 && buf[r+2][i-1]=='-') i--;//找到"---"左边界
while(buf[r+2][i]=='-' && buf[r+3][i]!='\0'){//找到字母
if(' '!=buf[r+3][i]){
build(r+3,i);//递归建树
}
i++;
}
}
System.out.print(")");
}
public static void main(String[] args) {
//输入
int i = 0;
while(!"#".equals((line=sc.nextLine()))){
int j = 0;
for(char c:line.toCharArray()){
buf[i][j] = c;
j++;
}
i++;
}
System.out.print("(");
for(i=0;i<buf[0].length;i++){
if(buf[0][i]!=' '){
build(0,i);
break;
}
}
System.out.print(")");
}
}