所以我想进入我的树(假设没有重复并正确分支)并找到参数中给出的元素。我发现我的方法给了我一个BinaryNode,它类似于我想要的(根)在其字段中,但实际上不是根。我没有覆盖equals方法。使用equals方法,当比较返回的对象和根时,测试返回false。我想知道为什么我的变量elementNode在设置为null时不引用(并因此更改)root为null。
二进制节点使用泛型实现。以root为起点调用此方法。任何帮助将不胜感激,谢谢。
/**
* 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和null,BinaryNode @ 68b0019f
编辑答案:返回的元素没有将它指向的节点设置为空的原因是因为在Java中,我们只能指向而不是编辑内存位置。因此,为了使我的节点为null,我将找到父节点,并将其左/右子节点设置为null。
答案 0 :(得分:0)
尝试这样的事情。
private boolean findElementNode(T element, BinaryNode<T> start) {
if (start == null) {
return false;
} else {
if (element.getElement().equals(start.getElement())) {
return true;
} else {
int comparison = element.compareTo(start.getElement());
if (comparison < 0) {
return findElementNode(element, start.getLeftChild());
} else {
return findElementNode(element, start.getRightChild());
}
}
}
编辑:这实际上就是你想要的。告诉我这是否有效。
private BinaryNode<T> findElementNode(T element, BinaryNode<T> start) {
if(start != null){
if(start.getElement().equals(element)){
return start;
} else {
BinaryNode<T> start = findElementNode(element, start.getLeftChild());
if(start == null) {
start = findElementNode(element, start.getRightChild());
}
return start;
}
} else {
return null;
}
}