【问题标题】:Binary search tree null pointer exception with traversal [duplicate]带有遍历的二叉搜索树空指针异常[重复]
【发布时间】:2017-07-08 17:13:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您缺少 NULL 检查。应该是

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

      【讨论】:

      • 你应该接受答案来表示感谢:P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多