二进制搜索树字符串插入/删除/打印

时间:2015-02-11 02:22:27

标签: java math binary-search-tree

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

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

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

return false;

1 个答案:

答案 0 :(得分:0)

如果你想看看BST的强大实现,可以参考一下:

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

另外,如果你想真正了解那里发生了什么以及为什么会这样,我建议你去那里寻找/阅读课程。

编辑:

嗯,首先,让我们在这里解决一些问题。

  1. 查看您的课程时,您声称每NodeTreeTree。现在,这可能有意义,但使用Nodes作为一组链接的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; } } 的包装应该是一种更容易的方法。

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

  3. 迭代版本:

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

    递归版:

    Tree

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

    另一方面,递归版本就是自建。在每个插入上,您将刷新到该路径的链接,在树下。

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

    您的示例让我相信您应该使用添加新元素的迭代版本。在这种情况下,您(我相信)只需要返回node.insert("1").insert("2"); 的实例进行方法链接,因此您可以执行以下操作:

    Node

    我仍然建议你修改一下Tree和{{1}}的方式,但是如果那不可能,那么我猜你需要以某种方式解决它。< / p>