Java 对象不同,但得到的是槽.equals函数和'==';操作人员

Java 对象不同,但得到的是槽.equals函数和'==';操作人员,java,recursion,binary-tree,operator-keyword,Java,Recursion,Binary Tree,Operator Keyword,我正在填充一棵二叉树,然后我尝试通过递归方法获取某个叶子的父级。每个节点包含字符串数据;假设我只为每个叶用“*”初始化字符串数据。 在该方法中,我遍历树,直到找到给定的节点(叶),以便返回父节点。 找到叶子后,我想检查节点(叶子)是否与我搜索的目标相同。 遗憾的是,情况并非如此,该方法返回第一个找到的父叶。 我使用了.equals()方法和“==”运算符,但它们都不起作用。 有人知道如何解决这个问题吗 BinaryNode root = new BinaryNode("root",2);

我正在填充一棵二叉树,然后我尝试通过递归方法获取某个叶子的父级。每个节点包含字符串数据;假设我只为每个叶用“*”初始化字符串数据。 在该方法中,我遍历树,直到找到给定的节点(叶),以便返回父节点。 找到叶子后,我想检查节点(叶子)是否与我搜索的目标相同。 遗憾的是,情况并非如此,该方法返回第一个找到的父叶。 我使用了.equals()方法和“==”运算符,但它们都不起作用。 有人知道如何解决这个问题吗

    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类中。非常感谢!