我有一种方法应该从二进制搜索树中删除给定的元素。但是,当我运行程序时,它实际上并没有从BST中删除任何元素。
我了解此功能的工作原理:将具有给定元素的节点的根设置为其他根,但是我几乎可以肯定我的方法是不正确的。我尝试仅将给定元素的节点设置为null
,但这也没有删除任何内容。
public boolean remove(int removalPoint) {
int maxData = 0;
if (root == null)
return false;
if (removalPoint == root.getData()) {
if (getRightSubtree().root == null && getLeftSubtree().root == null)
root = null;
if (getRightSubtree().root != null && getLeftSubtree().root == null) {
root = getRightSubtree().root;
getRightSubtree().root = null;
return false;
}
if (getLeftSubtree().root != null && getRightSubtree().root == null) {
root = getLeftSubtree().root;
getLeftSubtree().root = null;
return false;
}
if (getLeftSubtree().root != null && getRightSubtree().root != null) {
maxData = getLeftSubtree().deleteMax();
root.setData(maxData);
return false;
}
if (removalPoint < root.getData())
getLeftSubtree().remove(removalPoint);
if (removalPoint > root.getData())
getRightSubtree().remove(removalPoint);
}
return true;
}
public int deleteMax() {
int maxData = 0;
BSTNode RT = getRightSubtree().root;
if (RT == null) {
maxData = root.getData();
root = getLeftSubtree().root;
}
else
return getRightSubtree().deleteMax();
return maxData;
}
我的测试用例在主函数中的输出如下所示:
Remove 30, rc=false
20
19
16
12
9
8
6
5
4
Remove 20, rc=true
19
16
12
9
8
6
5
4
Remove 4, rc=true
19
16
12
9
8
6
5
Remove 19, rc=true
16
12
9
8
6
5
答案 0 :(得分:0)
首先,您检查root
是否具有要从树中删除的数据。
如果root
没有您要删除的值怎么办?
此外,作为一般说明,从树中删除是通过递归最优雅地完成的(尽管您的方法也可以使用)。这是递归完成的节点删除的一种实现: https://www.geeksforgeeks.org/binary-search-tree-set-2-delete/
答案 1 :(得分:0)
尤里卡!。事实证明,正是我对getRightSubtree()的使用(反之亦然)导致了问题,我应该只使用getRight和getLeft函数。从我收集到的信息来看,当我在为if语句等使用Subtree方法时,该程序仅检查Subtree的根,而不检查整个BST的其他节点。还鼓励我更改deleteMax函数,以便它返回一个BSTNode而不是一个Integer,这显然使最后一种情况更容易找出。这是我更新的代码:
`public boolean remove(int removalPoint){
if (this.searchRecursion(removalPoint) == null)
return false;
if (removalPoint < root.getData())
root.getLeft().remove(removalPoint);
if (removalPoint > root.getData())
root.getRight().remove(removalPoint);
if (root.data == removalPoint) {
if (root.getRight().root == null && root.getLeft().root == null) {
root = null;
return true;
}
if (root.getRight().root == null && root.getLeft().root != null) {
root = root.getRight().root;
return true;
}
if (root.getLeft().root != null && root.getRight().root == null) {
root = root.getLeft().root;
return true;
}
}
if (root.getLeft().root != null && root.getRight().root != null) {
root.setData(root.getLeft().deleteMax().getData());
return true;
}
return false;
}
public BSTNode deleteMax() {
BSTNode maxData;
if (root.getRight().root == null) {
maxData = root;
root = root.getLeft().root;
return maxData;
}
return root.getRight().deleteMax();
}`