Java 对象不同,但得到的是槽.equals函数和'==';操作人员
我正在填充一棵二叉树,然后我尝试通过递归方法获取某个叶子的父级。每个节点包含字符串数据;假设我只为每个叶用“*”初始化字符串数据。 在该方法中,我遍历树,直到找到给定的节点(叶),以便返回父节点。 找到叶子后,我想检查节点(叶子)是否与我搜索的目标相同。 遗憾的是,情况并非如此,该方法返回第一个找到的父叶。 我使用了.equals()方法和“==”运算符,但它们都不起作用。 有人知道如何解决这个问题吗Java 对象不同,但得到的是槽.equals函数和'==';操作人员,java,recursion,binary-tree,operator-keyword,Java,Recursion,Binary Tree,Operator Keyword,我正在填充一棵二叉树,然后我尝试通过递归方法获取某个叶子的父级。每个节点包含字符串数据;假设我只为每个叶用“*”初始化字符串数据。 在该方法中,我遍历树,直到找到给定的节点(叶),以便返回父节点。 找到叶子后,我想检查节点(叶子)是否与我搜索的目标相同。 遗憾的是,情况并非如此,该方法返回第一个找到的父叶。 我使用了.equals()方法和“==”运算符,但它们都不起作用。 有人知道如何解决这个问题吗 BinaryNode root = new BinaryNode("root",2);
BinaryNode root = new BinaryNode("root",2);
BinaryNode na = new BinaryNode("a",2);
BinaryNode naLeaf1= new BinaryNode("*",0);
BinaryNode naLeaf2 = new BinaryNode("*",0);
na.addChild(naLeaf1);
na.addChild(naLeaf2);
BinaryNode nb = new BinaryNode("b",2);
BinaryNode nbLeaf1= new BinaryNode("*",0);
BinaryNode nbLeaf2 = new BinaryNode("*",0);
nb.addChild(nbLeaf1);
nb.addChild(nbLeaf2);
root.addChild(na);
root.addChild(nb);
这是通过二叉树遍历的递归方法
public BinaryNode getParent(BinaryNode root, BinaryNode target) {
if(root!=null) {
for(BinaryNode ni: root.childeren) {
if(!ni.data.equals("*")) {
return getParent(ni, target);
}else {
if(ni.equals(target)) {
return root;
}
}
}
}
return root;
}
我为.equals方法添加了一个覆盖,但这似乎并不能解决问题
@Override
public boolean equals(Object target) {
if(target==null) return false;
if(target==this) return true;
if(!(target instanceof BinaryNode)) return false;
return false;
}
在.equals()重写中,您需要计算两个这样的对象之间的确切距离。如果对象的
根
和目标
相同,那么检查您输入的参数如何,这样对象就相等了。查看第一个if
条件!ni.data.equals(“*”)
。计算结果为false
,对吗?因为您将所有叶的数据设置为“*”。
这个ni.equals(target)
的计算结果也是false
,因为您的equals
方法没有任何错误,并且它按预期工作。
这对所有的孩子都会发生,你离开循环,返回root
你需要重新思考这个函数的逻辑,它是错误的。虽然
equals
没有问题(您不需要像这样重写它,只需使用=
)。您的问题不是“equals”方法,而是您使用的算法。首先,BinaryNode不是将父节点作为字段吗?如果不是,那么认真考虑添加。
如果确实不希望每个节点都知道其父节点,则需要遍历整个树,而不仅仅是一个分支。如下所示:
public BinaryNode getParentOf(BinaryNode target) {
for(BinaryNode child: children) {
if (child == target) {
return this;
}
BinaryNode result = child.getParentOf(target);
if (result != null ) {
return result;
}
}
return null;
}
但是说真的,请确保每个节点都知道它的父节点。如果不重写equals,它的行为与==。BinaryNode是否重写默认的equals()实现?如果是这样的话,你能展示一下吗?@Davidenhove,我还没有实现覆盖。我马上就去。谢谢@Davidenhove,我添加了覆盖,但这似乎并不能解决问题。难道没有办法检查对象的引用吗?你对算法的看法是对的,我已经处理好了。我还将父属性添加到BinaryNode类中。非常感谢!