【发布时间】:2014-01-02 09:11:33
【问题描述】:
所以我想进入我的树(假定没有重复项并且分支正确)并找到参数中给出的元素。我发现我的方法在其字段中为我提供了一个类似于我想要的(根)的 BinaryNode,但实际上不是根。我没有重写 equals 方法。使用 equals 方法,当返回的对象与根进行比较时,测试返回 false。我想知道为什么我的变量 elementNode 在设置为空时不引用(并因此更改)根为空。
二进制节点是用泛型实现的。以根为起点调用此方法。任何帮助将不胜感激,谢谢。
/**
* Returns the node that the sought element resides within
*
* @param element: The element being hunted
* @param start: The start of the search (usually the root)
* @return The node that the element resides in
*/
private BinaryNode<T> findElementNode(T element, BinaryNode<T> start) {
if (start.getElement().equals(element)) {
return start;
}
// the element is not in the collection
if (start.getLeftChild() == null && start.getRightChild() == null) {
return null;
}
int comparison = element.compareTo(start.getElement());
if (comparison < 0) {
return findElementNode(element, start.getLeftChild());
} else {
return findElementNode(element, start.getRightChild());
}
}
示例编辑:(这是一种删除方法)
if (!hasLeft && !hasRight) {
System.out.println(elementNode + "," + root);
elementNode = null;
System.out.println(elementNode + "," + root);
return true;
}
这个输出:
BinaryNode@68b0019f,BinaryNode@68b0019f and null,BinaryNode@68b0019f
编辑答案:返回的元素没有将其指向的节点设置为 null 的原因是因为在 Java 中,我们只能指向而不是编辑内存位置。因此,为了使我的节点为空,我将找到父节点并将其左/右子节点设置为空。
【问题讨论】:
-
"我知道这一点是因为根字段(树的成员)是我正在搜索的内容,并且它不等于找到的项目,即使所有字段都保持相同值。” 你能给我们举个小例子来说明这个问题吗?您是否覆盖了您的树所拥有的对象类中的
equals方法? -
我忘了补充一点,我一直在寻找有关这些的信息,但我的问题似乎太具体了。我认为错误很小,我只是忽略了一些明显的东西
-
目前这对于任何非完美平衡的树都将失败 - 您需要检查
start是否为空,或者只为存在的孩子递归调用findElementNode。除此之外,它看起来还不错 - 一个简短但完整的示例会很有用。在错误的描述中甚至不清楚您的意思...... -
John & ZouZou:我添加了那个检查和我的测试示例并澄清了我的解释
标签: java recursion binary-tree pass-by-reference