BinaryTree inOrder Traversal排序复杂性

时间:2015-06-17 18:28:58

标签: data-structures binary-tree

我很困惑为什么quicksort,shellsort,mergesort ...所有O(nlog(n))算法反复提到作为流行的排序算法,不按顺序遍历二叉搜索树给出O(n)复杂度来排序a树?我错过了什么?

3 个答案:

答案 0 :(得分:2)

没有。构建树具有O(N log N)复杂度(即,您将N个项插入树中,并且每个插入都具有对数复杂度)。

一旦你构建了树,你可以用线性复杂性遍历它(特别是如果它是一个线程树),但这不等于排序 - 它相当于在你对它进行排序后遍历一个数组。

尽管它们具有相同的渐近复杂度,但构建树通常会因为一个重要因素而变慢,因为您必须为树分配节点并遍历非连续分配的节点以遍历树。

答案 1 :(得分:0)

基本上有6种类型的复杂性。 O(1),O(logn)时间,为O(n),O(nlogn),O(N ^ 2),O(N ^ 3)。

对于你的问题的第一部分,为什么流行的排序算法具有O(nlogn)复杂度,这仅仅是因为我们无法对O(n)复杂度中的数组进行排序。 因为对于O(n)复杂性,您只想在一个循环中对数组进行排序。 这是不可能的,因为我们无法在一个strech中对数组进行排序。

所以下一个可能的复杂性是O(nlogn)。这就是在合并排序中分割和征服方法 我们发现中间元素递归地对每一侧进行排序。对于递归,因为每次复杂度为o(logn)时它的大小减小到一半。对于排序部分,它使O(nlogn)的复杂性。

对于问题的下一部分,请记住,BST中插入,删除等所有基本操作都具有O(logn)的复杂性,其中logn是树的高度。

因此,如果使用o(n)复杂度对树进行排序,使其总计为O(nlogn)。

如果你没有明白我的意见,请评论我。我认为这是回答它的简单方法。

答案 2 :(得分:0)

任何二叉树的遍历都是O(n)。但这不是排序。 有一个 BST 意味着已经是一个排序的树。你只是在穿越它。构建 BST 是渐近 O(nlog(n)) 的排序过程。 请注意 O(n) + O(nlog(n)) 与 O(nlog(n)) 相同。