Почему есть различия в поведении функций в Java и C ++? - PullRequest
0 голосов
/ 04 марта 2020

Я кодировал вопросы на LeetCode.com и столкнулся с проблемой при попытке решить проблему «Проверка дерева двоичного поиска». Код решения, написанный на Java, выглядит следующим образом:

public boolean helper(TreeNode node, Integer lower, Integer upper) {
if (node == null) return true;
}

int val = node.val;
if (lower != null && val <= lower) return false;
if (upper != null && val >= upper) return false;

if (! helper(node.right, val, upper)) return false;
if (! helper(node.left, lower, val)) return false;
return true;
}

public boolean isValidBST(TreeNode root) {
    return helper(root, null, null);}

Однако, когда я реализую тот же алгоритм на C ++, он работает неправильно, например, в [0, null , -1] контрольный пример. Там есть код:

bool isValidBST(TreeNode* root) {
    return checkSubtree(root, NULL, NULL);
}
bool checkSubtree(TreeNode* node, int lower, int upper) {
    if (node == NULL) return true;

    int val = node->val;
    if (lower != NULL && val <= lower) return false;
    if (upper != NULL && val >= upper) return false;

    if (! checkSubtree(node->right, val, upper)) return false;
    if (! checkSubtree(node->left, lower, val)) return false;
    return true;
  }

Почему это так? Возможно, что-то не так в нуль-нотации, но я не уверен.

1 Ответ

7 голосов
/ 04 марта 2020

В C ++ NULL - это "определяемая реализацией константа нулевого указателя" , обычно записываемая как 0. 0 является допустимым способом записи нулевого указателя в C ++. Также бывает допустимое значение int.

В Java, (Integer)0 и null - это не одно и то же.

В Java, lower != null проверяет, нет ли нижней границы. В C ++ lower != NULL проверяет, равна ли нижняя граница 0. Если в вашем дереве 0, ваша программа на C ++ запутывается, потому что считает, что для этой части дерева нет нижней / верхней границы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...