Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
175 views
in Technique[技术] by (71.8m points)

java - Why won't my binary tree display what's currently in it?

I'm trying to display() my binary tree with what's inside already but for some reason it's not working.
I'm getting nothing as an output.

Maybe my logic for the methods is off? I'm not quite sure.

Here's my Node.java file:

(content missing)

Here's my BinaryTree.java file:

public class BinaryTree {
public static Node root;

public BinaryTree() {
    this.root = null;
}

public void insert(Node n, Student s) {
    if(n != null) {
        while(true) {
            if(s.getLastName().compareTo(root.data) < 0) {
                insert(n.left,s);
            } else if(s.getLastName().compareTo(root.data) > 0) {
                insert(n.right,s);
            } else {
                System.out.println("Error!!!!!");
            }
        }
    }
}

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

}

Here's my Student.java file:

    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);    
    }

    public int compareTo(String s) {
        int lengthOfLongestString = 0; // Length of longest string that we will base.
        int i = 0; // Index of current string, will be incremented in for loop below.
        int a = 0; // Index of 
        int b = 0;

        if(lastName.length() < s.length()) { // If the string that's currently inside < incoming string
            lengthOfLongestString = lastName.length(); // Then set the current string as the new length.        
        } else {
            lengthOfLongestString = s.length();  // Else incoming string is the new length.
        }

        if(lastName.charAt(0) == s.charAt(0)) {
            for(i = 0; i < lengthOfLongestString; i++) {
                if(lastName.charAt(i) != s.charAt(i)) {
                    a++;
                    b++;
                    break;
                }
            }       

            if(i == lengthOfLongestString - 1) { // If i = length of last character of the string
                return 0;
            }

            if(lastName.charAt(a) < s.charAt(b)) {
                return -1;
            }   
        }
        return 1;
        }
}

Here's my Main.java file:

public class Main extends Student {

public Main(String first, String last, String ID) {
    super(first, last, ID);
}

public static void main(String[] args) {
        Student student = new Student("hi", "purple", "brown");
        Student student2 = new Student("red", "purple", "now");
        Node n = null;

        BinaryTree bt = new BinaryTree();
        bt.insert(BinaryTree.root, student);
        bt.insert(BinaryTree.root, student2);
        bt.display(BinaryTree.root);
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Few things wrong here, and it may not solve the problem immediately.

1) while(true) is going to spin forever and you never break out of it. Also you have an infinite loop within a recursive statement, which is just poor design.

2) You always are comparing s and root. You should compare n.data

3) You need to assign n.left and n.right at some point.

4) (Optional) Students can have the same last names.

5) You always insert into a BinaryTree from the root, so passing it in as a parameter seems redundant, but it doesn't need to be static.

bt.insert(student);

And you could write like this

private Node root;

public boolean insert(Student s) {
    return insert(this.root, s);
}

private boolean insert(Node n, Student s) {

    if (this.root == null) {
        this.root = n;
        return n == null;  // did you really insert something? 
    }

    if (n == null) return false;

    boolean inserted = false;

    if(s.getLastName().compareTo(n.data) <= 0) { // Compare same names
        if (n.left == null) {
            n.left = new Node(s); // Not sure what this looks like
            return true;       // Inserted a node
        }
        inserted = insert(n.left,s);
    } else if(s.getLastName().compareTo(n.data) > 0) {
        if (n.right == null) {
            n.right = new Node(s); // Not sure what this looks like
            return true;       // Inserted a node
        }
        inserted = insert(n.right,s);
    } else { // Should never get here 
        // Not actually an error
        // System.out.println("Error!!!!!");
    }
    return inserted;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...