-1

我在java中实现了一个二叉搜索树,递归地编写了这些方法。我做了插入方法,现在我被困在第一个遍历方法中,依次为1。当我在我的测试代码中调用它时,添加了一些元素(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()); 
} 

回答

0

在序的方法,因为它的递归方法的第一条语句应该检查空的参数,如果是这样,它应该返回。否则,当没有左子节点或右子节点时,当访问treeNode.getLeftChild()或treeNode.getRightChild()时,递归永远不会结束,并且会在NPE中运行。

0

您缺少NULL检查。它应该是

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

非常感谢! –

+0

你应该感谢接受答案:P – Ravi