我已经开始学习二进制搜索树,并且已经进行了一项练习,要求我用二进制搜索树来制作家谱。
我已经创建了它,但是我遇到了一些问题,所以我不确定它是否正确,并且它具有四个变量:名称,姓氏,父亲和母亲,这使得该树与我拥有的所有示例完全不同已经看过了。我将在下面的代码中显示我已经完成的工作:
//I have created a class Ancestor
public class Ancestor {
String name;
String surname;
Ancestor father;
Ancestor mother;
public Ancestor (String name, String surname){
this.name = name;
this.surname = surname;
father = null;
mother = null;
}
public void printAncestor() {
System.out.println("Ancestors:"+"");
}
public void postOrder (Ancestor a) {
if (a == null) {
return;
}
else {
postOrder(a.mother);
postOrder(a.father);
a.printAncestor();
}
}
}
//Another class familyTree
public class familyTree {
static Ancestor root = null;
static void insertAncestor (String n, String s){
Ancestor temp = root;
Ancestor prev = null;
boolean notFound = true;
while (temp != null && notFound){
if (temp.name.equals(n) && temp.surname.equals(s)){
notFound = false;
break;
}
else if (n.compareTo(n)<0 && s.compareTo(s)<0){
prev = temp;
temp = temp.mother;
}
else {
prev = temp;
temp = temp.father;
}
}
if (notFound){
Ancestor a = new Ancestor(n, s);
if (prev == null) {
root = a;
}
else if (n.compareTo(n)<0 && s.compareTo(s)<0){
prev.mother = a;
}
else {
prev.father = a;
}
}
}
}
//And I have tried to create a family tree in the main class
public class Main {
public static void main(String[] args) {
// write your code here
familyTree f = new familyTree();
f.insertAncestor("Adam", "H");
f.insertAncestor("Charles", "B");
f.insertAncestor("Mary", "C");
f.insertAncestor("Matthew", "W");
f.insertAncestor("Jane", "X");
}
}
我想知道我的课程是否有意义,因为它们没有显示错误,但是仍然可能令人困惑。我还想知道我是否正确创建了家谱,并且基于打印家谱的方法,我将如何打印它?我已经这样尝试过了:
f.postOrder();
但是它没有解决。所以我不确定这是怎么回事。正如我所说,变量(姓名,姓氏,父亲,母亲)与互联网和其他材料上的大多数示例不同,这一事实使我感到困惑。无论如何,我要先谢谢大家。
最佳答案
有几点。首先是一个小的样式问题:使用更具描述性的变量名称会更好。您的方法签名如下所示:
static void insertAncestor (String n, String s)
好吧,
n
和s
的参数名称不好。从上下文可以看出,n
是名称,而s
是姓氏,但为什么不直接将它们命名为name
和surname
呢?在实际的代码功能方面,这一行立即跳了起来:
else if (n.compareTo(n)<0 && s.compareTo(s)<0){
您正在将
n
和s
与它们自己进行比较,因此比较将始终为0,并且if块将始终被跳过,并落入else块。那里需要什么功能?您如何确定是否要从树的母亲侧或父亲侧滑下?您将如何指示“应将此新祖先作为根的母亲的母亲的父亲的母亲插入”?可能是二叉树根本不是您应该首先使用的数据结构的情况。并非每个数据结构都适合每个问题。