二元搜索树不能比较节点为空
我试图做的方法,从二进制搜索树中删除节点,我知道我的编程逻辑是正确的,但我不能比较我的焦点节点的节点的父母的左孩子。它必须有时是空的,我应该能够将它与对象进行比较?二元搜索树不能比较节点为空
这里是我的代码:
public void deleteNode(Node node) {
if (node.getParent().left().root == node) {
node.getParent().setLeft(null);
} else {
node.getParent().setRight(null);
}
}
所以这是导致问题的行
,因为它给NullPointerException异常。但我知道它应该是空的,这是代码的重点。我不会想使用尝试捕捉与NullPointerException异常或者是因为它是坏
好吧,让我们来分析你的代码,因为你不阅读注释:
public void deleteNode(Node node) {
if (node.getParent().left().root == node) {//this is where you get NullPointerException
node.getParent().setLeft(null);
} else {
node.getParent().setRight(null);
}
}
为什么你上线if (node.getParent().left().root == node)
得到一个NullPointerException异常?
你得到它,因为:node.getParent()
等于null
ORnode.getParent().left()
等于null
。你不能在null
上调用方法。 假设node.getParent()是null
在这种情况下,您正在调用null.left()
。 它有道理吗?
更改您的密码,以避免NullPointerException
:
if (node.getParent() != null) {
if (node.getParent().left() != null && node.getParent().left().root == node)
node.getParent().setLeft(null);
else
node.getParent().setRight(null);
}
注: @ user3790046我没有改变你的逻辑。我不知道它是否有意义,我只是添加了相关检查以避免NullPointerException。
非常好!感谢您的支持。现在的咖喱! – 2014-10-08 19:31:59
@ user3790046我很高兴它帮助你。重要的是总是试图自己解决它,但如果你被卡住了,这是一个合适的地方。 – Alboz 2014-10-09 15:18:00
首先检查是否存在左子节点node.getParent()!= null && node.getParent()。left()!= null – Alboz 2014-10-07 18:09:49
这不是从BST中删除的正确解决方案。我假设你知道递归? – 2014-10-07 18:16:24
@DavieBrown在调用deleteNode函数之前,我已经递归地搜索了正确的节点,然后搜索功能将节点放到了deleteNode函数的参数中。没有正确的方法来做到这一点? – 2014-10-07 18:20:03