看看维基百科上的实现,似乎标准的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);
}
答案 0 :(得分:1)
是的,总是在根节点上只是因为:
当然,您可以删除它,这会导致另一个节点成为根节点,但不会将原始第一个节点移动到树中的其他位置。
不平衡二叉树的退化情况是一个链表,其搜索时间复杂度为O(n)。
答案 1 :(得分:0)
是的,插入顺序会对结果树的形状/平衡产生负面影响。正如您所指出的,由此产生的树的最坏情况比O(log(N))更糟糕,并且可能最终看起来像链接列表。
答案 2 :(得分:0)
是的,这就是为什么存在自平衡BST的原因。
答案 3 :(得分:0)
SO answer中的一些好消息。
答案 4 :(得分:0)
是的,不平衡的BST可能很糟糕。实际上,如果将已排序的数据添加到BST,则可以快速将树退化为单链表性能,其中插入O(n),假设插入位于末尾。
如果您处理随机数据,标准BST平均表现会相当不错。你最坏的敌人是排序的,或反向排序的数据。
这就是为什么你通常想要使用平衡的BST(只需从你的语言库中选择一个)。