为什么要添加不平衡的二进制搜索树O(n)?

时间:2015-02-27 18:42:46

标签: java algorithm data-structures binary-tree binary-search-tree

这是从BST Add

添加二进制搜索树的实现
private IntTreeNode add(IntTreeNode root, int value) {
        if (root == null) {
            root = new IntTreeNode(value);
        } else if (value <= root.data) {
            root.left = add(root.left, value);
        } else {
            root.right = add(root.right, value);
        }

        return root;
    }

我理解为什么它在O(log n)中运行。这是我分析它的方式。我们的树大小为n。多少次切割2次或半切割会将此树减少到1的大小。因此我们得到表达式n(1/2)^ x = 1其中1/2表示每半切。为x解决这个问题,我们有log2(x),因此logn来自搜索 这是来自Heap的讲座幻灯片,讨论了不平衡二进制搜索的运行时。 enter image description here

我的问题是,即使二进制搜索树不平衡,分析add的运行时也不会使用相同的策略吗?你必须做多少削减。运行时不是O(log n),而不是O(n)吗?如果是这样,有人可以显示为什么它会是O(n)吗?

2 个答案:

答案 0 :(得分:3)

使用不平衡的树:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          ...

您对每次操作将树木切成两半的直觉不再适用。这种不平衡树是不平衡二叉搜索树的最坏情况。要搜索列表底部的10,您必须进行10操作,对树中的每个元素执行一次操作。这就是为什么非平衡二叉搜索树的搜索操作是 O (n) - 这个不平衡的二叉搜索树等同于链表。每个操作都不会切断一半树 - 只是您已经访问过的一个节点。

这就是为什么二叉搜索树的专用版本,例如红黑树和AVL树很重要:它们保持足够平衡的树,以便所有操作 - 搜索,插入,删除 - 仍然是 O (log n)。

答案 1 :(得分:1)

当您在最高位置有最小值或最大值时,会发生BST中的O(n)情况,从而有效地将您的BST变为链接列表。假设您添加了元素:1, 2, 3, 4, 5,生成BST,由于每个元素只有right child,因此它将成为链接列表。添加6必须在每个节点上正确运行,遍历所有元素,因此使得O(n)的渐近复杂性