-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