二叉搜索树

时间:2015-03-18 21:05:32

标签: java binary-search-tree

class Student
{
    String name;
    int roll;
    int age;
    public Student(String n,int r,int a) {
        name=n;
        roll=r;
        age=a;
    }
    public String retname() {
        return name;
    }
    public int retroll() {
        return roll;
    }
    public int retage() {
        return age;
    }
    public void displaystudent() {
        System.out.print("Name : "+name+" Roll : "+roll+" Age : "+age+"\n");
    }
}

class Node
{
    Student s;
    Node lchild;
    Node rchild;
    public Node(String n,int r ,int a) {
        s=new Student(n,r,a);
    }
    public void displayNode() {
        s.displaystudent();
    }
}
class Tree
{
    public Node root;
    public void insert(String n,int r,int a) {
        Node newNode=new Node(n,r,a);
        if(root==null)
            root=newNode;
        else {
            Node current=root;
            Node parent;
            while(true) {
                parent=current;
                if(n.compareTo(current.s.retname())<0) {
                    current=current.lchild;
                    if(current==null)
                        parent.lchild=newNode;
                    return;
                } else {
                    current=current.rchild;
                    if(current==null)
                        parent.rchild=newNode;
                    return;
                }
            }
        }
    }
    public void order() {
        inorder(root);
        preorder(root);
        postorder(root);
    }
    public void inorder(Node localroot) {
        if(localroot!=null) {
            inorder(localroot.lchild);
            localroot.displayNode();
            inorder(localroot.rchild);
        }
    }
    public void preorder(Node localroot) {

        if(localroot!=null) {
            preorder(localroot.lchild);
            preorder(localroot.rchild);
            localroot.displayNode();
        }
    }
    public void postorder(Node localroot) {
        if(localroot!=null) {
            localroot.displayNode();
            postorder(localroot.lchild);
            postorder(localroot.rchild);
        }
    }
}
class e
{
    public static void main(String [] args) { //throws IOException

        Tree t=new Tree();
        t.insert("E",1,23);
        t.insert("D",2,2);
        t.insert("C",3,4);
        t.insert("B",4,89);

        t.insert("A",5,45);

        t.order();
    }
}

上面的代码没有显示它应该的所有输出。另外,为什么预购和顺序给出相同的结果? 另外,如何在不从根开始的子树中进行遍历? 有没有办法避免递归?

这是当前不正确的输出。它应该按照特定的顺序打印我插入的所有元素。

Name : D Roll : 2 Age : 2 
Name : E Roll : 1 Age : 23 
Name : D Roll : 2 Age : 2 
Name : E Roll : 1 Age : 23 
Name : E Roll : 1 Age : 23 
Name : D Roll : 2 Age : 2 

1 个答案:

答案 0 :(得分:0)

我注意到的最明显和第一个问题是你的insert方法。在此方法中,您始终在检查while循环的下一次迭代之前返回(如果根具有子子节点,则不会插入任何内容)。要解决此错误,只需像这样更改while循环:

while(true)
     { 
        parent=current; //assign parent to root
        if(n.compareTo(current.s.retname())<0) 
        {
             current=current.lchild; 
             if(current==null) {//added brackets so the return only happened when this was true
               parent.lchild=newNode;
               return;
            }
       }
       else
       { 
        current=current.rchild;
        if(current==null){ //added brackets so the return only happened when this was true
            parent.rchild=newNode;
            return;
            }
        }
   }    

进行这些更改后,您可以自行回答其他问题。进行这些更改,看看它是否解决了您的问题,如果没有评论让我知道,我会再看看。

编辑一个:

我认为你的预购错了。我相信你应该在之前打印节点分别以递归方式遍历左右子节点。它应该是这样的:

   public void preorder(Node localroot) {

    if(localroot!=null) {
        localroot.displayNode(); //here!
        preorder(localroot.lchild);
        preorder(localroot.rchild);
        //localroot.displayNode(); not here!
    }
}