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

Algorithm 插入到BST时,插入的第一项是否始终是树的根?,algorithm,data-structures,binary-tree,Algorithm,Data Structures,Binary Tree,看看Wikipedia上的实现,标准的BST(非自平衡)在插入过程中似乎从不重新安排自己,因此添加的第一项始终是根。这是正确的吗?如果是这样的话,难道这不意味着BST通常比O(logN)更糟糕吗 将其用作递归插入的参考: /* Inserts the node pointed to by "newNode" into the subtree rooted at "treeNode" */ void InsertNode(Node* &treeNode, Node *newNode)

看看Wikipedia上的实现,标准的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);
 }
/*将“newNode”指向的节点插入到“treeNode”根目录下的子树中*/
void InsertNode(节点*&treeNode,节点*newNode)
{
if(treeNode==NULL)
treeNode=newNode;
else if(newNode->keykey)
InsertNode(treeNode->left,newNode);
其他的
插入节点(treeNode->右侧,新建节点);
}

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

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

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

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

这方面的一些好信息。

这方面的一些好信息。

是的,不平衡BST可能不好。事实上,如果将排序数据添加到BST,则可以快速将树降级为单链表性能,假设插入在末尾,则插入值为O(n)

如果您处理的是随机数据,则标准BST的平均性能会相当好。你最大的敌人是排序,或反向排序的数据


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

是的,不平衡的BST可能不好。事实上,如果将排序数据添加到BST,则可以快速将树降级为单链表性能,假设插入在末尾,则插入值为O(n)

如果您处理的是随机数据,则标准BST的平均性能会相当好。你最大的敌人是排序,或反向排序的数据

这就是为什么您通常希望使用平衡的BST(只需从您的语言库中选择一个即可)。

是的,它将始终位于根节点上,因为:

  • 那是你唯一能把它放在空树上的地方;及
  • 你不能移动它
当然,您可以删除它,这将导致另一个节点成为根节点,但不会将原始第一个节点移动到树中的其他位置

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

是的,它将始终位于根节点上,因为:

  • 那是你唯一能把它放在空树上的地方;及
  • 你不能移动它
当然,您可以删除它,这将导致另一个节点成为根节点,但不会将原始第一个节点移动到树中的其他位置


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

谢谢。但我只是想确认我的理解,添加到BST的第一个节点将始终是头部,对吗?是的,它将是一个只有根的单节点树。然后,你添加的第二个数字将是左边或右边的子数字,这取决于它是否大于根等等。是的,我知道如果我添加一个,它将是根,但我只是想确认,无论我添加了多少,第一个将仍然是根。看来确实如此。谢谢。但我只是想确认我的理解,添加到BST的第一个节点将始终是头部,对吗?是的,它将是一个只有根的单节点树。然后,你添加的第二个数字将是左边或右边的子数字,这取决于它是否大于根等等。是的,我知道如果我添加一个,它将是根,但我只是想确认,无论我添加了多少,第一个将仍然是根。看来确实如此。我先读了它,但它没有明确回答我的基本问题。我先读了它,但它没有明确回答我的基本问题。@BlankXavier,这是对BigO符号的误解。不存在O(n/2),因为O(n)是基于n的复杂度的相对度量,而相乘一半根本不会改变这种关系。O(n)、O(n/2)和O(n*1e200)都是一样的。@BlankXavier,这是对BigO符号的误解。不存在O(n/2),因为O(n)是基于n的复杂度的相对度量,而相乘一半根本不会改变这种关系。O(n)、O(n/2)和O(n*1e200)都是相同的。