HERE解释了级别顺序遍历的方法1具有O(n ^ 2)的时间复杂度。有人可以解释一下这个。我不确定作者如何说printGivenLevel()需要O(n)。
"时间复杂度:在最坏的情况下为O(n ^ 2)。对于倾斜的树,printGivenLevel()需要O(n)时间,其中n是倾斜树中的节点数。因此,printLevelOrder()的时间复杂度为O(n)+ O(n-1)+ O(n-2)+ .. + O(1),即O(n ^ 2)。"
相反HERE,似乎证明它是O(n)
答案 0 :(得分:2)
在附带的代码中,printGivenLevel()
确实是最O(n)
。
printGivenLevel()
的*复杂度函数是:
T(n) = T(left) + T(right) + O(1)
where left = size of left subtree
right = size of right subtree
在最坏的情况下,对于树中的每个节点,最多只有一个子,所以它看起来像这样:
1
2
3
4
5
6
7
8
...
现在,请注意算法的工作方式,从root开始,一直移动到所需的级别,同时每次递归时减少level
变量。因此,为了达到n
级别,您至少需要n
printGivenLevel()
次调用,因此{{>复杂功能 printGivenLevel()
1}}对于上面的例子是:
T(n) = T(n-1) + T(1) + O(1) = O(n) (can be proved used master theorem)
第一个实现要求您为每个级别执行printGivenLevel()
,因此对于同一个示例,您会遇到O(n^2)
的最差情况,因为您需要O(k)
来打印每个级别级别从1
到k
,即O(1 + 2 + 3 + ... + n) =(*) O(n(n+1)/2) = O(n^2)
,其中标有(*)
的相等性来自sum or arithmetic progression