【问题标题】:What is time complexity of recursive level order traversal of a binary tree二叉树的递归级序遍历的时间复杂度是多少
【发布时间】:2015-03-05 03:19:34
【问题描述】:

在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)。我不清楚。

谁能帮我理解。

【问题讨论】:

    标签: algorithm recursion binary-tree time-complexity


    【解决方案1】:

    对于像这样的倾斜树:

    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(depth) 时间,因为它每次都从根开始。

    时间复杂度为:

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

    【讨论】:

    • 顺便说一句,确保使用队列在 O(n) 时间内实现 BFS 算法。
    【解决方案2】:

    当然。

    请注意,这是一个算术级数。 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)
    

    这就是您达到这种复杂性的方式。

    【讨论】:

    • 抱歉没有具体说明。我的问题不是关于 AP 总和,而是这个方程的来源以及从 1 运行到调用 printlevel 的树的高度(在最坏的情况下为 n)的 for 循环怎么样。所以有两个疑问 1. 不应该是 O(n) * printlevel 的时间复杂度 2. 这个表达式从哪里来的 printlevel (O)(n) + O(n-1) 的时间复杂度 ...
    猜你喜欢
    • 2015-02-16
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多