【问题标题】:Binary Search Tree String Insertion/Delete/Print二叉搜索树字符串插入/删除/打印
【发布时间】:2015-04-11 07:16:56
【问题描述】:

我想使用公共方法在此BST 中插入、删除和打印字符串,而不是booleanvoid - 所以我必须返回。

在我的插入方法中,我试图检查null,以及树的左右两侧。如果标签和字符串之间的比较是< 0,我将left设置为当前节点的值。右侧也是如此。

我的问题,我在这个方法结束时返回什么?我对这部分感到困惑,在这种情况下我是否会返回自己?

return false;

【问题讨论】:

  • 否决者请发表评论?
  • 我不知道为什么你被否决了,但是发布充满编译问题的代码并提出模糊的问题:这已经足够了。
  • 这是我在 stackoverflow 上发布它的唯一原因,并且很确定 stackoverflow 的用途。
  • @laune 您现在可以查看更新的部分吗?

标签: java math binary-search-tree


【解决方案1】:

如果您想了解 BST 的健壮实现,这里有一个:

http://algs4.cs.princeton.edu/32bst/BST.java.html

另外,如果您想真正了解那里发生了什么以及为什么发生,我建议您也可以查看/阅读那里的课程。

编辑:

首先,让我们在这里解决几个问题。

  1. 看着你的班级,你声称每个Node 都是Tree。现在,这可能是有道理的,但使用 Tree 作为一组链接的 Nodes 的包装器应该是一种更简单的方法。

  2. 用所谓的外行术语来说,您可以通过递归和迭代两种方式进行 BST 操作。我会给你一个例子。

迭代版本:

private void addIterative(T item) {
    if (root == null) {
        root = new Node(item);
        return;
    }

    Node parent = null;
    Node node = root;

    int cmp = 0;
    while (node != null) {
        cmp = item.compareTo(node.item);

        if (cmp == 0) {
            return;
        } else if (cmp < 0) {
            parent = node;
            node = node.left;
        } else {
            parent = node;
            node = node.right;
        }
    }

    Node child = new Node(item);

    if (cmp < 0) {
        parent.left = child;
    } else if (cmp > 0) {
        parent.right = child;
    }
}

递归版本:

private Node add(Node node, T item) {
    if (node == null) {
        return new Node(item);
    }

    int cmp = item.compareTo(node.item);

    if (cmp == 0) {
        // it already exists
    } else if (cmp < 0) {
        node.left = add(node.left, item);
    } else {
        node.right = add(node.right, item);
    }

    return node;
}

在迭代版本中,您使用循环在树中移动,一旦找到添加节点的位置,您只需创建并链接它。

另一方面,递归版本可以说是自我构建。在每次插入时,您都在树下刷新指向该路径的链接。

所以,迭代 - 在 while 循环中遍历树;递归 - 通过递归调用在树中移动。

您的示例使我相信您打算使用添加新元素的迭代版本。在这种情况下,您(我相信)只需返回 Tree 的实例以进行方法链接,因此您可以执行以下操作:

node.insert("1").insert("2");  

我仍然建议您修改您对 Nodes 和 Trees 的看法,但如果这不可能,那么我想您需要以某种方式解决它。

【讨论】:

  • 谢谢,基本上一直在用这个。注意更新的问题
  • Elem 是一个字符串,而我给您的示例是用 T 参数化的,这意味着您可以将 T 视为字符串
  • 但是你还包括一个辅助节点变量 Node node 我可以在代码中使用上面的 Node 吗?
  • 您的 BST 实现让我得出一个结论,即您应该以迭代方式添加元素,然后返回 Tree 的实例以进行方法链接。所以,如果这就是它所需要的,那么最后你应该返回this
  • 为什么在这里检查 null if (cmp == 0) {
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多