我正在使用二叉搜索树进行类分配。我正在尝试通过将新节点分配给递归方法参数来替换具有不同节点的节点。
行node = minNode(node.right);
未按预期工作。它会修改参数SearchTreeNode<E> node
,但此更改不会传播到this.overallRoot
。例如,如果树的根是5,并且我们删除5,并且替换将是7,即使参数节点已经更改为7,this.overallRoot
仍然是5.请参阅下面的屏幕截图。
知道我做错了吗?
public void remove(E data) {
if (this.overallRoot != null) {
this.removeData(this.overallRoot, data);
}
}
private void removeData(SearchTreeNode<E> node, E data) {
if (node.data == data) {
if (node.left == null && node.right == null) {
node = null;
} else if (node.left != null && node.right != null) {
node = minNode(node.right);
} else if (node.right == null) {
node = node.left;
} else if (node.left == null) {
node = node.right;
}
} else if (data.compareTo(node.data) < 0) {
this.removeData(node.left, data);
} else if (data.compareTo(node.data) > 0) {
this.removeData(node.right, data);
}
}
private SearchTreeNode<E> minNode(SearchTreeNode<E> node) {
if (node.left == null) {
return node;
}
return minNode(node.left);
}
答案 0 :(得分:1)
您的诊断完全正确:修改node
没有任何好处,因为node
是一个局部变量。对参数的修改不会传播给调用者。
你可以修改node.left
和node.right
。这些变化是显而易见的。您需要重新构建代码才能利用它。这不是一个快速修复。
或者,您可以向removeData
的调用者返回一个值,并让调用者更改相应的变量。这也需要一些思考来确定每个removeData
分支的回报。调用它看起来像:
node.left = this.removeData(node.left, data);