为什么我的二叉树不会显示插入的内容?

时间:2017-04-30 12:09:30

标签: java algorithm data-structures binary-tree nodes

我想知道为什么我的display()方法即使在将项目插入我的二叉树之后也在打印基本案例。我想比较学生的姓氏。我想要的只是显示我的树,所以我可以确认insert()是有效的。

这是我的Node.java文件:

class Node  {
   Student data;
   Node left;
   Node right;

public Node(Student data) {
    this.data = data;
    left = null;
    right = null;
  }
}

这是我的BinaryTree.java文件:

public class BinaryTree {
    public Node root;

public void insert(Student s) {
    root.left = new Node(s);
    root.right = new Node(s);
    root = insert(s,root);
}

private Node insert(Student s, Node t) {
    if(t == null) {
        t = new Node(s);
        return t;
    }
    else { 
        if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
            t.left = new Node(s);
            t.left = insert(s,t.left);
            return t.left;
        } else if(s.getLastName().compareTo(t.data.getLastName()) > 0) {
            t.right = new Node(s);
            t.right = insert(s,t.right);         
            return t.right;
        }
    }
    return t;
}

public void display(Node root)  { 
    if(root == null) { 
        System.out.println("Nothing found.");
    } else if(root != null) {
        display(root.right);
        System.out.println(root.data);
        display(root.left);
    }
  }
}

这是我的Student.java文件:

public class Student {

private String firstName;
    private String lastName;
    private String id;

public Student(String first, String last, String Identification) {
    firstName = first;
    lastName = last;
    id = Identification;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public boolean equals(String studentId) {
    return id.equals(studentId);    
  }
}

这是我的Main.java文件:

public class Main {
  public static void main(String[] args) {
    Student student = new Student("hi", "bye", "testing");
    Student student2 = new Student("out", "some", "names");

    BinaryTree bt = new BinaryTree();
    bt.insert(student);
    bt.insert(student2);
    bt.display(bt.root);
   }
} 

这是控制台中的output

Nothing found.

1 个答案:

答案 0 :(得分:1)

我说要专注于插入逻辑,因为无论如何都是错误的。

您不需要显示方法来查看树。启动调试器,并检查左右Node对象引用

1)你立即在空树上击中nullpointerexception 2)您只需要在空树上分配根,而不是将每个节点设置为可以到达同一学生节点

例如,它就是这个

public class BinaryTree {
    public Node root;

    public void insert(Student s) {
        root = insert(s,root);
    }

    private Node insert(Student s, Node t) {
        if (root == null) return new Node(s);

        if (...) // compare names 

然后,如果你看这里,你可以随时覆盖new Node

    if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
        t.left = new Node(s);  // this is useless 
        t.left = insert(s,t.left);
        return t.left;

您需要检查何时在叶节点处,然后相应地返回。并且您需要返回当前节点备份递归,而不是孩子。

    if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
        if (t left == null) {
            t.left = new Node(s);
       } else {
            t.left = insert(s,t);  // insert using t as the new root 
       } 
       return t;  // return t with its new child 

为右侧做同样的事情

如果这不起作用,请尝试为小3节点树写出算法,然后为4-7节点平衡树写出