【问题标题】:Why is there difference in functions behavior in Java and C++?为什么 Java 和 C++ 中的函数行为存在差异?
【发布时间】:2020-06-16 22:49:58
【问题描述】:

我在 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;
  }

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

【问题讨论】:

  • 也许是因为它们是完全不同的语言?
  • 在当前形式下,Java 代码甚至无法编译。右括号过多。
  • @user253751 - 不,他们不应该。 C++ 有不同的对象模型。忽略的翻译永远不会做同样的事情。
  • 请提供minimal reproducible example并解释“它不能正常工作”的含义
  • Integer 在 Java 中可以是 null (因为这实际上只是一个指针)。 C++ 中的int 不是指针。如果int0 并且您检查它是否是NULL,您会得到true。在 Java 中,Integer 可以是 null,它与 0 不同。

标签: java c++ algorithm tree


【解决方案1】:

在 C++ 中,NULL"an implementation-defined null pointer constant",通常写为 00 是在 C++ 中编写空指针的有效方法。它也恰好是一个有效的int 值。

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

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

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 2016-03-23
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多