对象不同,但通过.equals函数和'=='运算符

时间:2014-12-06 15:00:31

标签: java recursion binary-tree operator-keyword

我正在填充二叉树,然后我尝试通过递归方法获取某个叶子的父级。每个节点都包含String数据;并且假设我只使用“*”为每个叶子初始化String数据。 在那个方法中,我遍历树,直到找到给定的节点(叶子),所以我可以返回父节点。 找到一个叶子后,我想检查节点(叶子)是否与我正在搜索的目标相同。 遗憾的是,情况并非如此,并且该方法返回父级第一个找到的叶子。 我使用了.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;
}

3 个答案:

答案 0 :(得分:2)

你的问题不是'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;
}

但严重的是,确保每个节点都知道它的父节点。

答案 1 :(得分:1)

在你的.equals()覆盖中,你需要对两个这样的对象的确切分离进行一些计算。如何检查您提供的参数,如果roottarget相同,则对象是相同的。

答案 2 :(得分:0)

查看第一个if条件!ni.data.equals("*")。评估结果为false,对吗?因为您为所有叶子设置数据为'*'。 此ni.equals(target)也会评估为false,因为您的equals方法没有任何问题,并且按预期工作。 这种情况发生在所有孩子身上,你离开了循环,然后返回root

你需要重新思考这个功能的逻辑,这是错误的。 equals虽然没有任何问题(你不需要像这样覆盖它,只能使用==)。