Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二叉搜索树插入-根保持空_Java_Binary Search Tree - Fatal编程技术网

Java 二叉搜索树插入-根保持空

Java 二叉搜索树插入-根保持空,java,binary-search-tree,Java,Binary Search Tree,我是Java新手,我想创建一个具有插入和前序遍历的二叉搜索树类,但是当我完成插入时,根对象仍然为null,并且编译器在前序遍历期间抛出NullPointerException 我的节点类: class Node { int info; Node left; Node right; public Node() { info = 0; left = null; right = null; } Node

我是Java新手,我想创建一个具有插入和前序遍历的二叉搜索树类,但是当我完成插入时,根对象仍然为null,并且编译器在前序遍历期间抛出NullPointerException

我的节点类:

class Node {
    int info;
    Node left;
    Node right;

    public Node() {
        info = 0;
        left = null;
        right = null;
    }

    Node(int x) {
        info = x;
        left = null;
        right = null;
    }
}
我的二叉搜索树类:

public class BinarySearchTree {

    private Node root;

    public BinarySearchTree() {
        root = null;
    }

    private void insertPrivate(Node node, int x) {
        if(node == null) {
            node = new Node(x);
        } 
        else {
            if(x < node.info) {
                insertPrivate(node.left, x);
            } 
        else if (x > node.info) {
                insertPrivate(node.right, x);
            }
        }
    }

    public void insert(int x) {
        insertPrivate(root, x);
    }

    private void preorderPrivate(Node node) {
        if(node != null) {
            System.out.println(node.info);
            preorderPrivate(node.left);
            preorderPrivate(node.right);
        }
    }

    public void preorder() {
        preorderPrivate(root);
    }

    public static void main(String[] args) {
        BinarySearchTree t = new BinarySearchTree();
        t.insert(12);
        t.insert(13);
        t.preorder();
    }
}
公共类二进制搜索树{
私有节点根;
公共二进制搜索树(){
root=null;
}
私有void insertPrivate(节点,int x){
if(node==null){
节点=新节点(x);
} 
否则{
if(xnode.info){
insertPrivate(node.right,x);
}
}
}
公共空白插入(int x){
insertPrivate(根,x);
}
私有void preorderPrivate(节点){
如果(节点!=null){
System.out.println(node.info);
前序第四节(左节);
preorderPrivate(node.right);
}
}
公共无效预订单(){
前序前驱(根);
}
公共静态void main(字符串[]args){
BinarySearchTree t=新的BinarySearchTree();
t、 插入(12);
t、 插入(13);
t、 前序();
}
}
试试: 节点左=新节点(); Node right=新节点()

更改
插入(int x)
如下所示:

public void insert(int x) {
    if (root == nul)
        root = new Node(x);
    else
        insertPrivate(root, x);
}

这个问题是对Java引用的误解,正如本节代码所示

  private void insertPrivate(Node node, int x) {
    if(node == null) {
        node = new Node(x);
    } 
    ....
Java引用按值传递到函数参数中

让我举个例子来说明

Node root = new Node(x);
// root == Node(x);

doSomething(root);
// Pass Node(x) into function;

void doSomething(Node node) {
    // root == Node(x);
    // node == Node(x); 

    node = new Node(y); // This updates node but not root
    // root == Node(x);
    // node == Node(y);

}    
你将不得不重新调整你的计划。一种方法是让
insertPrivate
返回一个
节点
,并将该值分配给root。这不是最有效的,但它会起作用

public void insert(int x) {
    root = insertPrivate(root, x);
}

private Node insertPrivate(Node node, int x) {
    if(node == null) {
        node = new Node(x);
    } 
    else {
        if(x < node.info) {
            node.left = insertPrivate(node.left, x);
        } 
    else if (x > node.info) {
            node.right = insertPrivate(node.right, x);
        }
    }
    return node;
}
public void insert(int x){
root=insertPrivate(root,x);
}
专用节点insertPrivate(节点节点,int x){
if(node==null){
节点=新节点(x);
} 
否则{
if(xnode.info){
node.right=insertPrivate(node.right,x);
}
}
返回节点;
}

您应该以某种方式返回新创建的节点,并将其分配给父节点的左侧或右侧节点。试试这个:

private Node insertPrivate(Node node, int x) {
    if(node == null) {
        node = new Node(x);
    } 
    else {
        if(x < node.info) {
            node.left = insertPrivate(node.left, x);
        } 
    else if (x > node.info) {
            node.right = insertPrivate(node.right, x);
        }
    }
    return node;
}
此外,preorderPrivate需要空检查:

private void preorderPrivate(Node node) {
    System.out.println(node.info);
    if (node.left != null)
        preorderPrivate(node.left);
    if (node.right != null)
        preorderPrivate(node.right);
}

现在它可以写入值12,但之后抛出异常。这也不起作用,对于递归情况也不起作用。这是正确的答案。它还包括了OP版本失败原因的一些解释。做得好。没问题,数据结构示例是用C++编写的,它有能力通过引用(或双指针)传递引用(或指针),这将允许你实现你原来的策略。我没有检查节点是否为空。
private void preorderPrivate(Node node) {
    System.out.println(node.info);
    if (node.left != null)
        preorderPrivate(node.left);
    if (node.right != null)
        preorderPrivate(node.right);
}