似乎无法插入二进制搜索树

时间:2016-10-12 06:24:59

标签: java binary-tree

当我在二叉搜索树中实现插入和打印时。它只打印出第一个根节点。请帮忙为什么?二进制搜索树的基本实现,从学习它们开始,然后转向使用它们的更高级的东西,但在第一步磕磕绊绊。看起来它没有将节点添加到根节点。

class bstrees{
class Node
 {
     int data;
     Node left;
     Node right;
     public Node(int data)
     {
         this.data=data;
         this.left=null;    
         this.right=null;
     }
 }
Node root;
bstrees(){root=null;}

public void insert(int data){
    root=insert_node(root,data);
}
public Node insert_node(Node r,int n){
    if(r==null){
        Node n1=new Node(n);
        //root=n1;
        return n1 ;
    }
    else if(root.data<=n){
        insert_node(root.right,n);
    }
    else{
        insert_node(root.left,n);
    }
    return r;
}
public void print_t(){
    print_t(root);
}
private void print_t(Node r){
    //System.out.println(r);
    if(r!=null){

    //  System.out.println(r.left);         
    //  System.out.println(r.right);
        print_t(r.left);
        System.out.println(r.data+" ");
        print_t(r.right);
    }

}


}
public class BST_prac {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    bstrees b1=new bstrees();
    b1.insert(5);
    b1.insert(1);
    b1.print_t();

}

}

只打印出5个。

2 个答案:

答案 0 :(得分:3)

在将值1插入树中的调用中,对insert_node(root.left,n)的调用会创建一个新节点,但不会存储对此新创建节点的引用,这意味着树本身就是有效的没有改变。引用应存储在新创建的节点的父节点中;这同样适用于将节点插入到右子树中。

答案 1 :(得分:0)

当您插入Codor所提到的新节点时,您不会存储父节点的引用,例如是否要添加到左节点或右节点。总是在创建新节点。我在插入方法中使代码工作时做了一点改动。

public void insert(int data){
        //creating root node if root node itself is null
        if(root==null){
            root =new Node(data);
        } else {
            root=insert_node(root, data, null, null);
        }
        //System.out.println("after insert root data is " + root.data);
    }
    public Node insert_node(Node node, int n, String dir, Node parent){
        //traverse and insert in proper nodes
        //assign left or right child based on some logic i have taken direction as string here.
        if(node == null) {
            Node n1 = new Node(n);
            if(dir.equalsIgnoreCase("left")) {
                parent.left = n1;
            } else {
                parent.right = n1;
            }
        }
        else if(root.data<=n){
            parent = root;
            insert_node(root.right, n, "right", parent);
        }
        else{
            parent = root;
            insert_node(root.left, n, "left", parent);
        }
        return root;
    }