Java 创建二叉树的时间复杂性

Java 创建二叉树的时间复杂性,java,tree,time-complexity,Java,Tree,Time Complexity,我试图从一个源创建一个树,该源提供:要添加到树中的2个节点,以及应该添加这2个新闻节点的节点。为了找到这个节点在树中的位置,我使用了一个以O(n)为单位的顺序遍历。因此,如果要在树中添加n个节点,那么整个树的创建将是O(n^2)。我的限制是,创建树只需要O(n) 在二叉树中查找节点是O(log(n)),因为该树具有log(n)级别(每个级别包含其上级别的两倍)。因此,要在二叉树中创建/插入n元素,它是O(nlog(n))您可以在HashMap[1]中保留对树的每个节点的引用,以获得对每个节点的O

我试图从一个源创建一个树,该源提供:要添加到树中的2个节点,以及应该添加这2个新闻节点的节点。为了找到这个节点在树中的位置,我使用了一个以O(n)为单位的顺序遍历。因此,如果要在树中添加n个节点,那么整个树的创建将是O(n^2)。我的限制是,创建树只需要O(n)

在二叉树中查找节点是
O(log(n))
,因为该树具有
log(n)
级别(每个级别包含其上级别的两倍)。因此,要在二叉树中创建/插入
n
元素,它是
O(nlog(n))

您可以在HashMap[1]中保留对树的每个节点的引用,以获得对每个节点的
O(log(n))
访问权,而不是典型的树的
O(log(n))
。这将使得在
O(n)
时间内构建树成为可能,因为HashMap允许您直接跳到节点,而不是从树的根节点遍历节点


[1] 密钥将是源用于唯一标识节点的任何内容(我假设它是一个整数或字符串)。该值将是对树中节点的引用。请注意,树实现必须将其所有节点公开,因此您可能需要自己编写树或找到合适的库(JDK的树(如TreeMap)保持其内部结构私有,因此它们不会剪切它)。

对于二进制搜索树,时间复杂度将为O(nlogn)当元素未被排序时,需要O(n^2)。这是因为在BST O(n)中在排序列表中插入一个元素所需的时间是n个元素O(n^2)的时间,而对于平衡或几乎平衡的二叉搜索树,插入的最大时间是logn,因此对于n个元素,它是nlogn

我真的看不出如何在
O(n logn)以下的时间内将n个节点一个接一个地添加到二叉树中
。你的描述中似乎遗漏了什么。我还假设这是一个家庭作业,所以你应该添加正确的标记。为什么你需要按顺序遍历来找到树中正确的位置?节点的排列方式应使您能够在O(log(n))平均时间内找到给定节点。如果你不能有这样的安排,可能二叉树不是适合你的数据结构。虽然这可以解决这个问题,但它引出了另一个问题:为什么不将数据存储在一个HashMap中,然后完全放弃树呢。twain249:真的。如果这是作业,我怀疑除了作业上写的以外,还有什么真正的理由使用树我能想到的一个现实(但很少)的原因是,系统需要在重新启动后从文件中快速恢复其状态(因此O(n)启动时间),并且在正常操作期间,系统有严格的最坏情况延迟要求(因此哈希映射的摊销O(1)是不可接受的,但需要树的可预测O(log(n))如果你存储字符串,我认为使用B-树而不是哈希表的一个优点是,使用哈希表你不能进行前缀搜索,而使用B-树你可以进行查找如果树是平衡的,
O(n)
如果树是不平衡的。创建/插入n个元素(如果排序为
O(n^2)