在Java中删除二进制搜索树中的节点
我试着用这个方法递归删除节点,但不知怎的,它说myRoot总是空的。你能告诉我怎么做吗在Java中删除二进制搜索树中的节点,java,data-structures,binary-search-tree,Java,Data Structures,Binary Search Tree,我试着用这个方法递归删除节点,但不知怎的,它说myRoot总是空的。你能告诉我怎么做吗 // To delete a node from the BST public Node deleteNode(Node myRoot, int toDel) { if (myRoot == null) return myRoot; else if (toDel < myRoot.data) myRoot.left = deleteNode(myRoot.left, toDel);
// To delete a node from the BST
public Node deleteNode(Node myRoot, int toDel) {
if (myRoot == null) return myRoot;
else if (toDel < myRoot.data) myRoot.left = deleteNode(myRoot.left, toDel);
else if (toDel > myRoot.data) myRoot.right = deleteNode(myRoot.right, toDel);
else {
// Leaf node
if (myRoot.right == null && myRoot.left == null) {
myRoot = null;
} else if (myRoot.left == null) { // No left child
myRoot = myRoot.right;
} else if (myRoot.right==null){ // No right child
myRoot = myRoot.left;
}
}
return myRoot;
}
//从BST中删除节点的步骤
公共节点deleteNode(节点myRoot,int-toDel){
如果(myRoot==null)返回myRoot;
如果(toDelmyRoot.data)myRoot.right=deleteNode(myRoot.right,toDel);
否则{
//叶节
if(myRoot.right==null&&myRoot.left==null){
myRoot=null;
}else如果(myRoot.left==null){//没有左子级
myRoot=myRoot.right;
}else如果(myRoot.right==null){//没有正确的子级
myRoot=myRoot.left;
}
}
返回myRoot;
}
注意:-此代码仅删除具有一个子节点或没有子节点的节点。我目前正在删除一个包含2个子节点的节点,因此请不要为我解决此问题。根据对该问题的评论,您正在询问IDE中的样式建议,具体涉及: IDE意味着当执行特定的
return
语句时,myRoot
总是null
。显然是这样的,因为if
确保了return
不会执行。您的IDE建议您将其更改为
if (myRoot == null) return null;
您是否这样做取决于您,但就个人而言,我会接受IDE的建议,因为它使代码更加清晰。如何剪切和粘贴实际的错误消息,而不是对其进行解释。另外,您确定它指的是您提出的方法吗?如果是这样,那么它标记的是哪一行?作为一个风格问题,我强烈建议对循环体和复合语句(如
If
,else
)始终使用块({…}
),即使主体仅包含一条语句。不遵循这种做法可能会导致麻烦,与人类对代码的误解有关,特别是,它至少导致了一个引人注目的安全漏洞。这是公平的。。但问题是,这不会从我的二叉搜索树中删除所需的节点。使用此方法后,我的二叉树没有任何变化。我在找原因。我不认为这回答了我的问题。我正在查找一个逻辑错误,但找不到任何错误。@spiritmonster,据我所知,您的问题是关于myRoot
将始终为空的消息。这就是我的回答。如果您在实现方法的那些部分时遇到了问题,而这些部分正是您想要完成的工作,那么这将是一个完全不同的问题的主题。当你发布这个问题时,一定要包括一个,因为你在这个问题中提出的内容不足以回答你现在似乎想要提出的问题。
if (myRoot == null) return null;