【问题标题】:Java return statement logic with a Binary search tree带有二叉搜索树的 Java 返回语句逻辑
【发布时间】:2020-08-06 20:09:37
【问题描述】:

我试图了解当第一个条件为真时,主插入方法上的 return 语句如何用空值替换创建的节点。

 public void insert(int input){
        insert(root, input);
    }
}

public Node insert(Node node, int key) {
    if (node == null) {
        return new Node(key);
    } else if (node.key > key) {
        node.left = insert(node.left, key);
    } else if (node.key < key) {
        node.right = insert(node.right, key);
    } else {
        return node;
    }
}

我对 return 语句如何工作的理解是它停止一个函数并返回一个值。因此,在这种情况下,将创建一个新节点,并将其作为数据的键,然后返回该节点。 return 语句还有其他作用吗?

【问题讨论】:

  • 此代码看起来不正确。可能还应该有一个root = ... 来实际更改树并真正插入节点。现在的代码确实只是生成一个新节点并将其返回,但从未将其添加到任何内容中。树没有改变,因此插入基本上没有做任何有意义的事情。此外,它在其他分支中缺少 return 语句。确定是要退货吗?我不这么认为。
  • 这段代码能编译吗?您对return 的理解似乎是正确的,但else ifelse 分支也应该有return 语句,而它们没有。
  • 除此之外它不会编译,因为它缺少返回语句,如果 root 已经存在,那么这会在你的树中添加一个节点,但如果 root 不存在,这个什么都不做。
  • 补充一点:root 最初很可能是null,因此root = insert(root, input); 才有意义,但前提是insert(Node node, int key) 在除node == null 之外的所有情况下都返回node。在当前状态下,即使在编辑之后,代码也不会编译,因为 所有 路径需要返回一个值(或抛出异常)。
  • 谢谢@Thomas,我知道了仍然会出现编译错误。我最后的 return 语句应该在 if else 块之后,我的错。但我的困惑源于 return 语句如何将 null 值(即当 root 为 null 时)替换为创建的节点而无需任何形式的赋值

标签: java data-structures


【解决方案1】:

您的代码中有两个问题,这些问题加在一起可以解释为什么您无法理解return 的角色。

  1. 您的insert(input) 方法忽略了其insert(node, key) 调用的返回值。这意味着如果rootnull,则不会在这三个中插入任何内容
  2. 您的insert(node, key) 方法不会返回所有代码路径的值。这意味着代码甚至无法编译,也不正确。

固定的代码可能如下所示:

public void insert(int input) {
    root = insert(root, input); // 1
}

public Node insert(Node node, int key) {
    if (node == null) {
        return new Node(key);
    }

    if (node.key > key) {
        node.left = insert(node.left, key);
    } else if (node.key < key) {
        node.right = insert(node.right, key);
    }

    return node; // 2
}

这只是确保当前节点总是在插入发生后(递归地)返回,或者如果因为值已经存在而没有发生插入。

现在return 逻辑应该有意义了。

【讨论】:

  • 感谢 Konrad 对代码的更正。然而,我的困惑是第一个 return 语句如何用 null 值替换节点对象(即当 root 为 null 时)。我认为它应该只创建一个新节点并在没有分配的情况下返回它。再次感谢
  • @alexolakpe 正如你所说:“它应该只创建一个新节点并在没有分配的情况下返回它。”这正是发生的事情。 return 语句不会“替换”任何东西:它只是返回一个新创建的节点。该新节点的分配由 调用者 完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2018-09-09
相关资源
最近更新 更多