在树中查找Parentnode时的NullPointerExceptions

时间:2013-05-29 22:00:40

标签: java tree parent

我正在尝试编写一个方法,该方法返回给定节点的父节点。

public BinarySearchTreeNode<T> getParent(BinarySearchTreeNode<T> e) {
    if (e == null) {
        return null;
    }
    BinarySearchTreeNode<T> current = this.root;
    T eValue = e.getValue();
    while (current != null) {
        if (howManyChildren(current) == 0) {
            return null;
        } else if (eValue.equals(current.getLeft().getValue())
                || eValue.equals(current.getRight().getValue())) {
            return current;
        } else if (eValue.compareTo(current.getValue()) < 0) {
            current = current.getLeft();
        } else {
            current = current.getRight();
        }
    }
    return null;

}

但是,当一个或两个子节点为空节点并且equals尝试将该值与null进行比较时,我会收到NullPointerExceptions。 我该如何解决这个问题?我还是Java新手。

2 个答案:

答案 0 :(得分:1)

在对它们调用方法之前,您确实需要检查子项是否为null。在这种情况下,您调用current.getLeft().getValue(),但左子项可能为null。如果它为null,您将获得NullPointerException。

以下是在调用方法之前检查以确保它们不为null的示例。警告,除了NullPointerException之外,我没有检查整个代码是否正确。

public BinarySearchTreeNode<T> getParent(BinarySearchTreeNode<T> e) {
    if (e == null) {
        return null;
    }
    BinarySearchTreeNode<T> current = this.root;
    T eValue = e.getValue();
    while (current != null) {
        if (howManyChildren(current) == 0) {
            return null;
        } else if ((current.getLeft()!=null && eValue.equals(current.getLeft().getValue()))
                || (current.getRight()!=null) && eValue.equals(current.getRight().getValue())) {
            return current;
        } else if (eValue.compareTo(current.getValue()) < 0) {
            current = current.getLeft();
        } else {
            current = current.getRight();
        }
    }
    return null;

}

答案 1 :(得分:0)

对于对象变量,当值为null时,那里没有可以提供你要调用的方法的对象。

将对象变量的值与null进行比较:

if (obj == null) {
    ... do whatever ...
}

在许多情况下,您可以将对象与null进行比较,如下所示:

if (obj.equals(null)) ...

String s = null;

if (obj.equals(s)) ... this works
if (s.equals(obj)) ... this doesn't work

注意

在您的代码中,如果您要搜索的节点是根节点,它将永远找不到它。

同样,您检查所有孩子是否匹配,然后通过将值与父母进行比较来确定哪些孩子可以匹配。也许你应该重新排序一下,以便测试当前节点

如果为null,则搜索以失败告终 如果匹配,则返回在上次迭代时保存的父级。 如果它不匹配,则根据值和循环获得正确的子项 - 右或左 -

这样做的好处是,只有当您知道节点不为空时,才能获得节点的值。

T eValue = e.getValue();

BinarySearchTreeNode<T> prev = null;
BinarySearchTreeNode<T> current = this.root;
while (current != null) {
    int compare = eValue.compareTo(current.getValue());
    if (compare == 0) {
        return prev;
    }

    prev = current; // save the parent in case it matches
    if (compare < 0) {
        current = current.getLeft();
    } else {
        current = current.getRight();
    }
}