Java 为什么外接程序不平衡的二叉搜索树是O(n)?

Java 为什么外接程序不平衡的二叉搜索树是O(n)?,java,algorithm,data-structures,binary-tree,binary-search-tree,Java,Algorithm,Data Structures,Binary Tree,Binary Search Tree,这是从中实现的外接程序二叉搜索树 private IntTreeNode添加(IntTreeNode根,int值){ if(root==null){ 根=新的IntTreeNode(值); }如果(值与不平衡树: 1 \ 2 \ 3 \ 4 \ 5 \ ... 您在每次操作中将树一分为二的直觉不再适用。此不平衡树是不平衡二叉搜索树的最坏情况。要搜索列表底部的10,必须对树中的每个元素执

这是从中实现的外接程序二叉搜索树

private IntTreeNode添加(IntTreeNode根,int值){
if(root==null){
根=新的IntTreeNode(值);

}如果(值与不平衡树:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          ...
您在每次操作中将树一分为二的直觉不再适用。此不平衡树是不平衡二叉搜索树的最坏情况。要搜索列表底部的
10
,必须对树中的每个元素执行
10
操作。这就是为什么要对不平衡的bin执行搜索操作二元搜索树是O(n)-这个不平衡的二元搜索树相当于一个链表。每个操作都不会将树的一半切掉——只是切掉您已经访问过的一个节点


这就是为什么二进制搜索树的专门版本(如红黑树和AVL树)非常重要的原因:它们维护的树足够平衡,因此所有操作(搜索、插入、删除)仍然是O(log n)。

对于不平衡树:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          ...
您在每次操作中将树一分为二的直觉不再适用。此不平衡树是不平衡二叉搜索树的最坏情况。要搜索列表底部的
10
,必须对树中的每个元素执行
10
操作。这就是为什么要对不平衡的bin执行搜索操作二元搜索树是O(n)-这个不平衡的二元搜索树相当于一个链表。每个操作都不会将树的一半切掉——只是切掉您已经访问过的一个节点


这就是为什么二进制搜索树的特殊版本(如红黑树和AVL树)非常重要的原因:它们维护的树足够平衡,因此所有操作(搜索、插入、删除)仍然是O(logn)。

O(n)
BST中的情况发生在顶部有最小值或最大值时,有效地将BST转换为一个链接列表。假设您添加了如下元素:
1、2、3、4、5
,生成BST,该BST将是一个链接列表,因为每个元素只有一个
正确的子元素在每个节点上,遍历所有元素,从而使add
O(n)

的渐近复杂性成为
O(n)
BST中的情况发生在顶部有最小值或最大值时,有效地将BST转换为一个链接列表。假设您添加了如下元素:
1、2、3、4、5
,生成BST,该BST将是一个链接列表,因为每个元素只有一个
正确的子元素在每个节点上,遍历所有元素,从而使add
O(n)

add 1,2,3,4,5,6,7,8,9,10的渐近复杂度按顺序增加。我明白了,你必须迭代其余的元素,但我分析它的方法不仍然可以显示它的O(logn)?我不理解你的分析。什么是2或一半的切割?你把这棵树缩小到1的大小是什么意思?当你添加上面的元素时,这棵树看起来是什么样子?@CommittedDroyer不,不总是。想想当一棵子树总是空的情况。在这种情况下,它只是把大小缩小了1,而不是一半。哦,你每次只需要切一个,使其为O(n),因为需要n次切才能得到大小为1的子树。谢谢,伙计们,这很有意义。按顺序加上1,2,3,4,5,6,7,8,9,10。我明白了,你必须对其余的子树进行迭代,但我分析它的方法是否仍然可以证明其为O(logn)?我不理解你的分析。什么是2或一半的切割?你把这棵树缩小到1的大小是什么意思?当你添加上面的元素时,这棵树看起来是什么样子?@CommittedDroyer不,不总是。想想当一棵子树总是空的情况。在这种情况下,它只是把大小缩小了1,而不是一半。哦,你每次只需要切一个,使其为O(n),因为要得到大小为1的子树需要n次切。谢谢,伙计们,这很有意义。