Algorithm 如何在O(n)时间内从值的ArrayList创建AVL树?

Algorithm 如何在O(n)时间内从值的ArrayList创建AVL树?,algorithm,tree,Algorithm,Tree,我的任务是在O(n)时间内从值的排序数组列表创建一个AVL树,其中n是值的数量 我一直在做这个,但我不能得到O(n)时间,我能得到的最好的是O(nlog(n)) 我的问题是,每次插入导致树不平衡的节点时,我都必须执行另一个循环来找到不平衡的节点,并应用旋转来再次平衡树 非常感谢您的帮助,谢谢 插入是O(logn),确实如此,插入时没有人能比O(nlogn)做得更好。实际上,您不应该将插入到AVL树中。你应该创建一棵树。创建所有节点,并在构建新节点时从数组中拾取值。不要查找/搜索所需的值,只需获取

我的任务是在O(n)时间内从值的排序数组列表创建一个AVL树,其中n是值的数量

我一直在做这个,但我不能得到O(n)时间,我能得到的最好的是O(nlog(n))

我的问题是,每次插入导致树不平衡的节点时,我都必须执行另一个循环来找到不平衡的节点,并应用旋转来再次平衡树

非常感谢您的帮助,谢谢

插入是
O(logn)
,确实如此,插入时没有人能比
O(nlogn)
做得更好。实际上,您不应该将插入到AVL树中。你应该创建一棵树。创建所有节点,并在构建新节点时从数组中拾取值。不要查找/搜索所需的值,只需获取它,数组已排序

给定一个包含5个元素并已排序的列表,例如
[1,2,3,4,5]
,树的根是什么?7个元素怎么样?10? ...?

在得到根之后,左边子树的根是什么。要查看的列表是什么?列表的哪一部分必须存储在左子树中


仅此而已。

创建一个完整的平衡树,在最底层可能缺少几个节点,例如,对于6个元素,创建

o / \ o o / \ / o o o o / \ o o / \ / 欧欧欧 然后按顺序行走,当您访问第i个节点时,将其键设置为[i]

这是一个有效的AVL树,因为每个节点都有一个左右子节点,其高度最多相差一个

原始树可以在O(n)中构造,有序遍历可以在O(n)中进行,因此复杂度为O(n)


顺便提一下,在一个半相关的注释中,有一种称为heapify的技术,用于从长度为n的数组的O(n)的整数数组中构建堆(mix或max),即使插入到堆中的是O(logn)-诀窍是自下而上。

提示:列表开始排序-这意味着
n log n
工作已经为您完成。如果你知道列表的长度,你就可以准确地知道每个列表成员在树中的位置。另外:在构建树的过程中,你不必设置主平衡约束。只要确保完成后,它是平衡的。