我需要根据下面给出的规范构建一个族谱。希望它是Java的吗
输入将如下所示: 父项名称子项数量子项名称以空格分隔 终止 下一个输入中的行数 祖先子女 例如: 希纳2号基尚金贾 基山1号安什 结束 一, 金加尔·安什 在这里,如示例所示,我们可以采用多行输入,并且输入端被终止。然后我们给出一个数字,指定下一个输入中有多少行。 下一个输入询问kinjal是否是ansh的祖先。 输出应该是NO 有人能帮忙吗 我创建了两个单独的列表,其中包含编号和名称。我完全迷路了,请帮帮我我需要根据下面给出的规范构建一个族谱。希望它是Java的吗,java,tree,Java,Tree,输入将如下所示: 父项名称子项数量子项名称以空格分隔 终止 下一个输入中的行数 祖先子女 例如: 希纳2号基尚金贾 基山1号安什 结束 一, 金加尔·安什 在这里,如示例所示,我们可以采用多行输入,并且输入端被终止。然后我们给出一个数字,指定下一个输入中有多少行。 下一个输入询问kinjal是否是ansh的祖先。 输出应该是NO 有人能帮忙吗 我创建了两个单独的列表,其中包含编号和名称。我完全迷路了,请帮帮我 import java.util.ArrayList; import java.uti
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
class test3
{
//static int index;
public static void main(String[] args)
{
List<String> temp=new ArrayList<>();
ArrayList<String> words=new ArrayList<>();
ArrayList<Integer> number=new ArrayList<>();
String t="";
String t1="END";
String rootfromlist="";
Scanner scan=new Scanner(System.in);
while (scan.hasNext())
{
t=scan.next();
if(t.equals(t1)) {
break;
} else {
temp.add(t);
}
}
String[] temp2=new String[temp.size()];
for(int i=0;i<temp2.length;i++)
{
temp2[i]=temp.get(i);
}
Iterator<String> itr=temp.iterator();
String regex="[0-9]+";
int i=0,j=0;
while(itr.hasNext())
{
temp2[i]=(String)itr.next();
if(temp2[i].matches(regex))
{
number.add(Integer.parseInt(temp2[i]));
i--;
j++;
}
else
{
words.add(temp2[i]);
}
i++;
}
Iterator itr2=number.iterator();
while(itr2.hasNext())
{
System.out.println(itr2.next());
}
System.out.println(number.get(0));
List<String> wodupli=words.stream().distinct().collect(Collectors.toList());
ArrayList<String> a=new ArrayList<>();
boolean prev=false;
int index=0;
String tt="null";
//here i am trying to make list "a" such that as array of binary tree. that is then i will able to access children of node by formula 2*i+1 and 2*i+2. but the logic id not correct
for(int k=0;k<number.size();k++)
{
if(number.get(k)==2)
{
if(prev==false)
{
a.add(wodupli.get(index));
a.add(wodupli.get(2*index+1));
a.add(wodupli.get(2*index+2));
}
if(prev==true)
{
a.add(wodupli.get(index-1));
a.add(wodupli.get(2*index));
a.add(wodupli.get(2*index+1));
}
index=index+3;
prev=false;
}
if(number.get(k)==1)
{
a.add(wodupli.get(index));
a.add(wodupli.get(index+1));
a.add(tt);
index+=3;
prev=true;
}
}
for(int l=0;l<a.size();l++)
{
System.out.println(a.get(l));
}
}
}
我想知道如何动态创建树。因为这里的二叉树逻辑不起作用 好的,您的问题似乎是不知道要使用什么数据结构 正如您所了解的,二进制搜索树不是您所需要的: 二叉搜索树是用来用一个键查找东西的。树表示键和值之间的关系。您希望表示值之间的关系;i、 e.家谱中的人 家谱不是二元的。一个人可以有两个以上的孩子 所以,您实际上需要做的是设计一个代表一个人的类:让我们称它为person。一个人需要至少表现出以下关于该人的事情: 姓名 这个人的孩子。。。可以是列表或数组
其次,您需要某种映射数据结构,将人名映射到其person对象。你可以用地图来做这个 接下来,您需要一些代码来读取输入文件,创建人员记录并填充地图。代码还应该将个人记录链接到家谱中 最后,您将需要一些简单的代码来回答以下问题:A是B的祖先吗。。。这可以通过递归地在树上行走一段时间来回答
坏消息是,您编写的大部分代码可能需要扔掉。好消息是,新代码将更符合逻辑/更容易理解。展示您尝试过的内容,并详细说明解决方案的错误之处。所以,这不是一个编码服务。请先尝试自己,如果你得到任何错误,然后张贴在这里,我们将帮助你解决这个问题,尝试自己编码。我认为这里最困难的部分是正确地分割输入。将其存储在合适的类型树映射或其他东西中应该很容易。所以,开始编码,告诉我们你做了什么,代码中什么不起作用,不知道从哪里开始可能会瘫痪,我知道,在那里,做了那件事。一件重要的事情是做一些事情,它并不总是正确的,但它可能会引导你找到更好的答案。想到的事情;扫描器,由于格式比较简单,是众所周知的字符串,int,n系列可选字符串。另一种更为暴力的方法是使用Stringsplit将其分解为单独的值,这些值更易于解析。因此,不要试图解决整个问题,分解并解决每个部分,首先要弄清楚如何解析文本的第一行好吧。。。我不介意扔掉我的密码。。谢谢你的帮助。。我将尝试使用u建议的逻辑,您将需要某种映射数据结构,将人名映射到其person对象。你可以用地图来做这个。由于人名已经包含在person中,我更喜欢所有person对象的简单集合,请按照我在@c0der中的建议说出列表谢谢您的帮助!