插入BST时,第一项是否始终插入树的根?

时间:2009-04-22 23:36:27

标签: algorithm data-structures binary-tree

看看维基百科上的实现,似乎标准的BST(非自我平衡)在插入过程中从不重新排列,因此添加的第一个项目将始终是根。它是否正确?如果是这样,这是否意味着BST有可能经常比O(logN)更糟糕?

使用它作为递归插入的参考:

 /* Inserts the node pointed to by "newNode" into the subtree rooted at "treeNode" */
 void InsertNode(Node* &treeNode, Node *newNode)
 {
     if (treeNode == NULL)
       treeNode = newNode;
     else if (newNode->key < treeNode->key)
       InsertNode(treeNode->left, newNode);
     else
       InsertNode(treeNode->right, newNode);
 }

5 个答案:

答案 0 :(得分:1)

是的,总是在根节点上只是因为:

  • 这是你唯一能把它放在空树上的地方;和
  • 你没有搬家。

当然,您可以删除它,这会导致另一个节点成为根节点,但不会将原始第一个节点移动到树中的其他位置。

不平衡二叉树的退化情况是一个链表,其搜索时间复杂度为O(n)。

答案 1 :(得分:0)

是的,插入顺序会对结果树的形状/平衡产生负面影响。正如您所指出的,由此产生的树的最坏情况比O(log(N))更糟糕,并且可能最终看起来像链接列表。

答案 2 :(得分:0)

是的,这就是为什么存在自平衡BST的原因。

答案 3 :(得分:0)

SO answer中的一些好消息。

答案 4 :(得分:0)

是的,不平衡的BST可能很糟糕。实际上,如果将已排序的数据添加到BST,则可以快速将树退化为单链表性能,其中插入O(n),假设插入位于末尾。

如果您处理随机数据,标准BST平均表现会相当不错。你最坏的敌人是排序的,或反向排序的数据。

这就是为什么你通常想要使用平衡的BST(只需从你的语言库中选择一个)。