【问题标题】:Java binary search tree - insert implementationJava二叉搜索树——插入实现
【发布时间】:2015-05-13 23:08:39
【问题描述】:

我在执行二叉搜索树插入时遇到了这个问题。现在我用递归方法和迭代方法都试过了。到目前为止我得到的方式是“最好的”,因为对于树大小 = 31609 和树高 = 35,插入大约需要 100 秒,它应该是 WAAAAAAY 低大约一秒.有人可以给我一个提示我可能做错了什么吗?

这是我到目前为止所做的代码(插入不重复):

void insert(int val){
    if(this.elem < val){
        if(this.right != null){
            this.right.insert(val);
        }
        else{
            nodes++;
            this.right = new Node(val);
        }
    }
    else if(this.elem > val){
        if(this.left != null){
            this.left.insert(val);
        }
        else{
            nodes++;
            this.left = new Node(val);

        }
    }
    else {
        return;
    }
}

【问题讨论】:

  • 我怀疑问题出在insertion 本身。能否提供有关构造函数的信息?
  • 构造函数真的很基础:private Node (int elem){ this.elem=elem;}
  • nodes++ 是什么意思?您是否在每个节点存储树的大小?
  • 单次调用 insert 需要 100 秒,还是构建整个树需要 100 秒?
  • @drBet:问题可能出在其他地方,因为this ideone 只需要大约 40 毫秒来处理 10 万次插入(是的,我知道这只是一个测试,但 100 秒和 40 毫秒之间存在巨大差异)。我能想到的唯一问题是数据已排序,因此您创建了一个链表。这棵树不是自平衡的,因此如果数据是有序的,这将导致问题。

标签: java algorithm tree binary-search-tree


【解决方案1】:

如果使用第270行定义的函数进行插入,时间长其实是可以解释的。

看看这段代码:

public void insert(int val) {

        if (root == null) {
            nodes++;
            root = new Node(val);
        } else if (!root.exists(val)) {
            root.insert(val);
        }

    }

this调用了exists()函数,定义如下:

boolean exists(int val) {
            return val == this.elem
                    || (val < this.elem ? (this.left != null && this.left.exists(val))
                            : (this.right != null && this.right.exists(val)));
        }

当你看到这段代码时,你可以很容易地发现,也许每次你调用这个函数时,你的代码都会递归地遍历整个树!所以如果你插入 100K 次,你的代码最坏的运行时间是 O(n^2*logn),所以 100 秒实际上是一个很好的运行时间!

我认为你要做的就是修改你的 exists() 函数。

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多