我已经开始学习二进制搜索树,并且已经进行了一项练习,要求我用二进制搜索树来制作家谱。

我已经创建了它,但是我遇到了一些问题,所以我不确定它是否正确,并且它具有四个变量:名称,姓氏,父亲和母亲,这使得该树与我拥有的所有示例完全不同已经看过了。我将在下面的代码中显示我已经完成的工作:

//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)


好吧,ns的参数名称不好。从上下文可以看出,n是名称,而s是姓氏,但为什么不直接将它们命名为namesurname呢?

在实际的代码功能方面,这一行立即跳了起来:

else if (n.compareTo(n)<0 && s.compareTo(s)<0){


您正在将ns与它们自己进行比较,因此比较将始终为0,并且if块将始终被跳过,并落入else块。

那里需要什么功能?您如何确定是否要从树的母亲侧或父亲侧滑下?您将如何指示“应将此新祖先作为根的母亲的母亲的父亲的母亲插入”?可能是二叉树根本不是您应该首先使用的数据结构的情况。并非每个数据结构都适合每个问题。

07-24 14:36