什么是二叉树的递归级别顺序遍历的时间复杂度

时间:2015-01-07 09:13:32

标签: algorithm recursion binary-tree time-complexity

THIS geeksforgeeks链接中,他们将递归级别顺序遍历的时间复杂度描述为O(n^2)

时间复杂度:最差情况下为O(n^2)。对于倾斜的树,printGivenLevel()需要O(n)次,其中n是倾斜树中的节点数。因此,printLevelOrder()的时间复杂度为O(n) + O(n-1) + O(n-2) + .. + O(1) O(n^2)。这对我来说并不清楚。

有人可以帮我理解。

2 个答案:

答案 0 :(得分:2)

对于这样的偏斜树:

1
 \
  2
   \
   ...
     \
      N

此树的深度为N,因此以下函数将从1运行到N,

printLevelorder(tree)
for d = 1 to height(tree)
   printGivenLevel(tree, d);

即,

printGivenLevel(tree, 1);
printGivenLevel(tree, 2);
...
printGivenLevel(tree, N);

printGivenLevel(tree, depth)每次从根开始都需要O(深度)时间。

时间复杂度是:

O(1) + O(2) + ... + O(N) = O(N^2)

答案 1 :(得分:1)

不确定

请注意,这是一个算术级数。 We know它总结如下:

n + (n - 1) + (n - 2) + ... + 1 = n * (n - 1) / 2

可是:

n * (n - 1) / 2 = (n^2 - n) / 2

然而,we know表示二次(平方)项支配表达式与线性项相比并且1 / 2是一个常数因子,这两者都简化了表达如下:

首先,放弃常数因子:

O((n^2 - n) / 2) = O(n^2 - n)

接下来,保持主导词:

O(n^2 - n) = O(n^2)

这就是你如何达到这种复杂性。