【问题标题】:Binary tree level order traversal time complexity二叉树级顺序遍历时间复杂度
【发布时间】:2015-02-16 10:19:54
【问题描述】:

HERE说明层序遍历方法一的时间复杂度为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)

【问题讨论】:

  • 第二个假设树是平衡的,第一个不做这个假设
  • 但是最坏的情况是 O(n^2) .. 你能帮我理解一下吗?
  • @amit 的回答很好地解释了这一点。
  • @amit 的回答很好地解释了这一点。 [2]

标签: algorithm binary-tree tree-traversal


【解决方案1】:

在附加的代码中,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       
            ...               

现在,请注意算法的工作方式,您从根开始,一直到所需的级别,同时在每次递归时减少 level 变量。因此,为了达到nth 级别,您至少需要nprintGivenLevel() 调用,因此上述示例中printGivenLevel()复杂性函数 是:

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

【讨论】:

  • 当您说“在附加的代码中”时,您指的是哪个代码?
  • "为了达到第 n 级,您将需要至少 n 次 printGivenLevel() 调用,这使得它成为 O(n)。"那个怎么样 ?您是否假设 printGivenLevel() 为 O(1) ?
  • 你说“第一个实现”指的是什么
  • @AnkitAgrawal 我指的是您链接到的帖子中的第一个实现,其中树级顺序遍历是使用printGivenLevel() 实现的。查看试图澄清问题的已编辑答案。
  • 答案仍然令人困惑。您是否建议第一个实施与“第二个”实施不同。反正没关系
【解决方案2】:

我们可以用 always(best,avg,worst) O(n) 时间复杂度以简单的方式执行级别顺序遍历。

简单的 Python 代码:

def level_order(self):
    print(self.root.data,end=' ')
    root=self.root
    a=[root]
    while len(a)!=0:
        tmp=[]
        for i in a:
            if i.left!=None:
                tmp.append(i.left)
                print(i.left.data,end=' ')
            if i.right!=None:
                tmp.append(i.right)
                print(i.right.data,end=' ')
        a=tmp 

解释:a是当前级别节点的所有地址列表; tmp 是一个存储a 的子节点地址的列表。如果len(a)=0,表示它是最后一级,所以循环中断。

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2021-08-25
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多