我对二叉搜索树插入的实现存在这个问题。现在我已尝试使用递归方法和迭代方法。我到目前为止的方式是“最好”,因为对于树大小= 31609和树高= 35,插入大约需要 100秒,并且应该是WAAAAAAY低于1秒。有人可以给我一个暗示我可能做错的事吗?
以下是我到目前为止设法完成的代码(无重复插入):
ans
答案 0 :(得分:1)
如果您使用第270行中定义的函数进行插入,则实际上可以解释很长时间。
看看这段代码:
public void insert(int val) {
if (root == null) {
nodes++;
root = new Node(val);
} else if (!root.exists(val)) {
root.insert(val);
}
}
这会调用函数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()函数。