Метод равно для сравнения двух деревьев - PullRequest
1 голос
/ 21 марта 2011

просто еще одна небольшая проблема.Я также должен создать метод equals для моего класса IntTree, который просматривает два дерева и сравнивает узлы.Если все значения в дереве равны, то он возвращает истину, в противном случае он возвращает ложь.Вот код, который у меня есть до сих пор:

private boolean equals(IntTreeNode node1, IntTreeNode node2){
    if ((node1 != null) || (node2 != null)){
        if (node1.equals(node2)){
            equals(node1.left, node2.left);
            equals(node1.right, node2.right);
            return node1.equals(node2);
        }
    }
    return false;
}

Когда я вызываю этот метод в моей программе Driver для сравнения двух абсолютно одинаковых деревьев (blah1.equals (blah2)), я получаю false.Тем не менее, когда я вызываю blah1.equals (blah1), я получаю истину ... Я не уверен, что мое возвращаемое утверждение также верно *

Ответы [ 3 ]

4 голосов
/ 21 марта 2011

Почему вы делаете два равенства без обработки результата?

Я бы изменил внутреннее, если бы просто

return equals(node1.left, node2.left) && equals(node1.right, node2.right); 
2 голосов
/ 22 марта 2011

Я рискну предположить, что вы не переопределили метод equals IntTreeNode или не сделали это правильно.

Я бы сделал это примерно так:

public boolean equals(Node other) {
    if (other == null ) return false;

    boolean valuesEqual = this.value == other.value;
    boolean leftEquals = this.left == null ? other.left == null : this.left.equals(other.left);
    boolean rightEquals = this.right == null ? other.right == null : this.right.equals(other.right);

    return valuesEqual && leftEquals && rightEquals;
}

А затем для сравнения двух деревьев вы можете просто позвонить rootNode.equals(otherRootNode)

0 голосов
/ 09 декабря 2015
private boolean equals(IntTreeNode node1, IntTreeNode node2) {
    if (node1 == node2) {
        return true;
    }

    if (node1 == null || !node1.equals(node2)) {
        return false;
    }

    return equals(node1.left, node2.left) && equals(node1.right, node2.right);
}
...