二元搜索树不能比较节点为空

问题描述:

我试图做的方法,从二进制搜索树中删除节点,我知道我的编程逻辑是正确的,但我不能比较我的焦点节点的节点的父母的左孩子。它必须有时是空的,我应该能够将它与对象进行比较?二元搜索树不能比较节点为空

这里是我的代码:

public void deleteNode(Node node) {   
     if (node.getParent().left().root == node) { 
      node.getParent().setLeft(null); 
     } else { 
      node.getParent().setRight(null); 
     } 
    } 

所以这是导致问题的行

,因为它给NullPointerException异常。但我知道它应该是空的,这是代码的重点。我不会想使用尝试捕捉与NullPointerException异常或者是因为它是坏

+2

首先检查是否存在左子节点node.getParent()!= null && node.getParent()。left()!= null – Alboz 2014-10-07 18:09:49

+0

这不是从BST中删除的正确解决方案。我假设你知道递归? – 2014-10-07 18:16:24

+1

@DavieBrown在调用deleteNode函数之前,我已经递归地搜索了正确的节点,然后搜索功能将节点放到了deleteNode函数的参数中。没有正确的方法来做到这一点? – 2014-10-07 18:20:03

好吧,让我们来分析你的代码,因为你不阅读注释:

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()等于nullORnode.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。

+0

非常好!感谢您的支持。现在的咖喱! – 2014-10-08 19:31:59

+0

@ user3790046我很高兴它帮助你。重要的是总是试图自己解决它,但如果你被卡住了,这是一个合适的地方。 – Alboz 2014-10-09 15:18:00