Java не возвращает правильный результат для поиска по дереву при инкриминировании по сравнению с добавлением - PullRequest
0 голосов
/ 18 февраля 2019

Надеюсь, это будет простой вопрос.Я пытаюсь найти уровень заданного уникального числа в двоичном дереве.Мое двоичное дерево таково, что

[1,2,3,null,4,null,5]

Я пытаюсь проверить, равны ли высоты двух узлов, в данном случае 4 и 5. Я реализовал решение следующим образом.

public int findNodeHeight(TreeNode root, int nodeValue, int height){
    //if end of tree, exit loop
    if(root == null){
        return -1;
    }
    //if we found the value, return height
    if(root.val == nodeValue){
        return height;
    }

    //check the left
    int left = findNodeHeight(root.left,nodeValue,height++);
    if(left!=-1){
        return left;
    }
    //check the right
    int right = findNodeHeight(root.right,nodeValue,height++);
    if(right!=-1){
        return right;
    }

    return -1;
}

Однако это не работает, и он возвращает высоту 2 для 5 (что правильно) и высоту 1 для 4 (что неверно).Однако, если я изменю оператор ++ на

height+1 

следующим образом:

public int findNodeHeight(TreeNode root, int nodeValue, int height){

    if(root == null){
        return -1;
    }

    if(root.val == nodeValue){
        return height;
    }

    //check the left
    int left = findNodeHeight(root.left,nodeValue,height+1);
    if(left!=-1){
        return left;
    }
    //check the right
    int right = findNodeHeight(root.right,nodeValue,height+1);
    if(right!=-1){
        return right;
    }

    return -1;
}

Решение теперь работает.Почему неправильно использовать оператор ++ в вызове метода?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Причина в том, что метод выполняется со значением height, когда вы передаете height++, а затем значение height увеличивается на 1.

height++ - оператор постинкрементного увеличения, что увеличило бы значение height на 1 только после выполнения оператора.++height - это оператор предварительного увеличения, который будет увеличивать значение height на 1 до выполнения оператора.

Если вы используете оператор предварительного увеличения на height, он может нормально работать в тех случаях, когда второй вызов findNodeHeight вообще не выполняется, но может привести к аномалиям при выполнении второго вызова findNodeHeight, поскольку он обновил бы значение height на второмвызов.Следовательно, было бы целесообразно использовать height+1 в случае, если он дает правильный результат, поскольку операторы приращения могут не всегда предоставлять правильный результат.

0 голосов
/ 18 февраля 2019

Это вызвано тем, что

height++

возвращает высоту и высоту и увеличивает высоту на единицу, а

height+1

просто возвращает высоту + 1 и не увеличивает высоту, чтотакже быть проблемой.

0 голосов
/ 18 февраля 2019

Вы не можете использовать ++ в вызове метода в этой ситуации , поскольку var++ увеличивает var, но возвращает оригинал var, что означает, что вы просто передаете var.Вместо этого, если вы использовали ++var, он будет увеличивать var и передавать только что увеличенное значение.

...