二叉树级别顺序遍历时间复杂度

时间:2014-12-17 18:59:35

标签: algorithm binary-tree tree-traversal

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)

1 个答案:

答案 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)来打印每个级别级别从1k,即O(1 + 2 + 3 + ... + n) =(*) O(n(n+1)/2) = O(n^2),其中标有(*)的相等性来自sum or arithmetic progression