您将获得一个数字,它是二叉搜索树的根。然后,您将获得一个N元素数组,您必须将其插入到二叉搜索树中。如果数组处于排序顺序,则时间复杂度为N ^ 2。我需要以更好的复杂性获得相同的树结构(比如NlogN)。我尝试了很多,但无法解决它。有人可以帮忙吗?
答案 0 :(得分:0)
我假设所有数字都是不同的(如果不是这样,你可以使用一对(数字,索引)代替。)
假设我们要插入我们要插入元素X
。如果它是迄今为止最小/最大的元素,它清晰的地方。
我们a = max y: y in tree and y < X
和b = min y: y in tree and y > X
。我声称:
其中一个是另一个的祖先。
a
没有合适的孩子或b
没有左孩子。
证明:
不是这样的。让l = lca(a, b)
。由于a
在其左子树中,b
在其右子树中,a < l < b
。矛盾。
让a
成为b
的祖先。如果b
有一个左孩子c
。比a < c < b
。矛盾(另一种情况同样处理)。
所以解决方案是这样的:
让我们保留一组已经存在于树中的元素(我的意思是一个有效的集合,其中包含低级操作,如C ++中的std::set
或Java中的TreeSet
)。
让我们在每次插入时(使用set的lower_bound操作在a
时间内)找到b
和O(log N)
。其中只有一个没有合适的孩子。这就是新元素的用武之地。
总时间复杂度显然是O(N log N)
。
答案 1 :(得分:-1)
如果你在字典中查找单词,可以打开中途的字典并查看页面。然后,它会告诉您搜索词是否在字典的第一个或第二个半部分。重复,消除每个传球中剩余一半的一半,然后你很快将它缩小到一个单词。 40亿字词典将需要大约32遍。
二叉搜索树使用相同的原理。除了查找,您还可以插入。插入是O(log N),除非树变得退化。 为了防止树变质,你使用了一个&#34; red&#34;和&#34;黑&#34;节点(颜色只是传统的),你不允许长时间运行 要么是颜色。完整的解释在我的书“基本算法”
中http://www.lulu.com/spotlight/bgy1mm
实施就在这里
https://github.com/MalcolmMcLean/babyxrc/blob/master/src/rbtree.c https://github.com/MalcolmMcLean/babyxrc/blob/master/src/rbtree.h
但如果你想了解红黑,你需要一些解释 它的树木。