为什么 Java 和 C++ 中的函数行为存在差异?

Ale*_*nko -2 c++ java algorithm tree

我在 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);}
Run Code Online (Sandbox Code Playgroud)

但是,当我在 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;
  }
Run Code Online (Sandbox Code Playgroud)

为什么会这样?也许 NULL 表示法有问题,但我不确定。

use*_*751 7

在 C++ 中,NULL“一个实现定义的空指针常量”,通常写成0. 0是在 C++ 中编写空指针的有效方法。它也恰好是一个有效值int

在Java中,(Integer)0null是不是一回事。

在 Java 中,lower != null检查是否没有下界。在 C++ 中,lower != NULL检查下限是否不为 0。如果您的树中有 0,您的 C++ 程序就会感到困惑,因为它认为树的那部分没有下限/上限。