我正在尝试编写一个方法,该方法返回给定节点的父节点。
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新手。
答案 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();
}
}