Почему мой двоичный узел равен методу, выдающему ошибку подтверждения? - PullRequest
0 голосов
/ 30 апреля 2018
public class BinaryTreeNode<T> {

private BinaryTreeNode<T> left;
private BinaryTreeNode<T> right;
private T data;

public BinaryTreeNode(){
    this(null,null,null);
}

public BinaryTreeNode(T theData){
    this(theData,null,null);
}

public BinaryTreeNode(T theData, BinaryTreeNode<T> leftChild, BinaryTreeNode<T> rightChild){
    data = theData;
    left = leftChild;
    right = rightChild;

   @Override
public boolean equals(Object o){
        if(o instanceof BinaryTreeNode<?>) {
           BinaryTreeNode<?> n1 = (BinaryTreeNode<?>) o;
           if(this.getLeft() == null && n1.getLeft() == null && this.getRight() == null && n1.getLeft() == null) {
               return this.data == n1.getData();
           }
         if(this.getRight() == null && n1.getRight() == null && this.getLeft() != null && n1.getLeft() != null) {
             return this.data == n1.getData();
         }
         if(this.getLeft() == null && n1.getLeft() == null && this.getRight() != null && n1.getRight() != null) {
             return this.data == n1.getData();
         } else {

          return false;
         }
     }
}

public class BinaryTreeTesting {
BinaryTreeNode<Integer> node15 = new BinaryTreeNode<Integer>(5);
BinaryTreeNode<Integer> node2 = new BinaryTreeNode<Integer>(5);

  @Test
   public void testEqualsObjectNode() {
   assertTrue(node15.equals(node2));
   assertFalse(node1.equals(node2));

}

Пожалуйста, помогите мне выяснить, почему мой метод equals не проходит мой тест junit. Я сделал основной метод тестирования, и он должен быть точно таким же, я продолжаю получать ошибку подтверждения. Я даже добавил метод toString для проверки, и я получаю одинаковую строку для обоих узлов, так почему он утверждает, что он не равен?

1 Ответ

0 голосов
/ 30 апреля 2018

Прежде всего

if(this.getLeft() == null && n1.getLeft() == null && this.getRight() == null && n1.getLeft() == null) {

неверно, должно быть

if(this.getLeft() == null && n1.getLeft() == null && this.getRight() == null && n1.getRight() == null) {

Во-вторых, во втором и третьем if с вы не сравниваете, чтобы увидеть, эквивалентны ли левый и правый узлы, соответственно. Например, во второй ветви вы проверяете, не являются ли правые поддеревья нулевыми, а левые поддеревья нулевыми. Но вы не проверяете, совпадают ли левые поддеревья.

В-третьих, похоже, вам не хватает фигурных скобок. Вот рабочая версия вашего кода.

public class BinaryTreeNode<T> {

    private BinaryTreeNode<T> left;
    private BinaryTreeNode<T> right;
    private T data;

    public BinaryTreeNode() {
        this(null, null, null);
    }

    public BinaryTreeNode(T theData) {
        this(theData, null, null);
    }


    public BinaryTreeNode(T theData, BinaryTreeNode<T> leftChild, BinaryTreeNode<T> rightChild) {
        data = theData;
        left = leftChild;
        right = rightChild;

    }

    public BinaryTreeNode<T> getLeft() {
        return left;
    }

    public void setLeft(BinaryTreeNode<T> left) {
        this.left = left;
    }

    public BinaryTreeNode<T> getRight() {
        return right;
    }

    public void setRight(BinaryTreeNode<T> right) {
        this.right = right;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public boolean equals(Object o) {
        if (o instanceof BinaryTreeNode<?>) {
            BinaryTreeNode<?> n1 = (BinaryTreeNode<?>) o;
            if (this.getLeft() == null && n1.getLeft() == null && this.getRight() == null && n1.getRight() == null) {
                return this.data == n1.getData();
            }
            if (this.getRight() == null && n1.getRight() == null && this.getLeft() != null && n1.getLeft() != null) {
                return this.data == n1.getData();
            }
            if (this.getLeft() == null && n1.getLeft() == null && this.getRight() != null && n1.getRight() != null) {
                return this.data == n1.getData();
            } else {

                return false;
            }
        }
        return false;


    }


    public static void main(String args[]) {

        BinaryTreeNode<Integer> node15 = new BinaryTreeNode<Integer>(5);
        BinaryTreeNode<Integer> node2 = new BinaryTreeNode<Integer>(5);
        BinaryTreeNode<Integer> node1 = new BinaryTreeNode<Integer>(1);

        System.out.println(node15.equals(node2));
        System.out.println(node1.equals(node2) == false);

    }

}
...