具有遍历的二进制搜索树空指针异常

时间:2017-07-08 17:13:21

标签: java data-structures nullpointerexception binary-search-tree

我在java中实现二进制搜索树,递归地编写方法。我做了插入方法,现在我停留在第一个遍历方法,顺序一个。当我在我的测试代码中调用它时,在添加了几个元素(tree.inorderTraversal)后,我在递归顺序方法中得到一个空指针异常,我不明白为什么。插入方法可能有问题吗?

public void insertInBinaryTree(E newItem)
{
    BinaryTreeNode<E> node = new BinaryTreeNode<E>(newItem);
    if (root == null) {
        root = node;
    } else {
        insert(root, newItem);  
    }
}

// Recursively insert a node containing newItem into a non-empty tree. Used
// by insertInBinaryTree
private void insert(BinaryTreeNode<E> treeNode, E newItem)
{
    if (newItem.compareTo(treeNode.getItem()) < 0) {
        if (treeNode.getLeftChild() != null) {
            insert(treeNode.getLeftChild(), newItem);
        }
        else {
            treeNode.setLeftChild(new BinaryTreeNode<E>(newItem));
        }
    }
    else {
        if (treeNode.getRightChild() != null) {
            insert(treeNode.getRightChild(), newItem);
        }
        else {
            treeNode.setRightChild(new BinaryTreeNode<E>(newItem));
        }
    }
}

// If the tree is not empty, initiates an inorder traversal. This should
// print all items in ascending order. If the tree is empty, just prints
// "Tree is empty"
public void inorderTraversal()
{
    System.out.println("\nInorder Traversal");

    if (root == null) {
        System.out.println("Tree is empty");
    } else {    
        inorder(root);
    }


}

// Recursive inorder traversal of a non-empty tree. Used by
// inorderTraversal.
private void inorder(BinaryTreeNode<E> treeNode)
{
    inorder(treeNode.getLeftChild());
    System.out.print(treeNode.getItem());
    inorder(treeNode.getRightChild());
}

2 个答案:

答案 0 :(得分:0)

您缺少NULL检查。它应该是

private void inorder(BinaryTreeNode<E> treeNode)
{
    if(treeNode != null)
    {
    inorder(treeNode.getLeftChild());
    System.out.print(treeNode.getItem());
    inorder(treeNode.getRightChild());
    }
}

答案 1 :(得分:0)

在inorder方法中,由于它的递归方法,第一个语句应该在参数上检查null,如果是,那么它应该返回。否则递归永远不会结束,并且当没有左子节点或右子节点时,在可能的null上访问treeNode.getLeftChild()或treeNode.getRightChild()时它会运行到NPE。