二叉树遍历的复杂性

时间:2010-12-28 15:09:48

标签: time-complexity

数据结构中二进制树的inorder,postorder和preorder遍历的时间复杂度是多少?是O(n)还是O(log n)还是O(n ^ 2)?

8 个答案:

答案 0 :(得分:67)

有序,预订和后序遍历是Depth-First遍历。

对于图表,深度优先遍历的复杂度为O(n + m),其中n是节点数,m是边数。

由于二叉树也是图形,因此这同样适用。 这些深度优先遍历的复杂度是O(n + m)。

由于在二进制树的情况下,可以源自节点的边数限制为2,因此二进制树中的最大总边数为n-1,其中n是节点的总数。

然后,复杂性变为O(n + n-1),即O(n)。

答案 1 :(得分:23)

O(n),因为您遍历每个节点一次。或者更确切地说 - 您为每个节点执行的工作量是不变的(不依赖于其余节点)。

答案 2 :(得分:8)

我会说,O(n)。 我正在做一棵平衡的树,适用于所有树木。 假设你使用递归,

T(n)= 2 * T(n / 2)+ 1 ----------> (1)

左子树的T(n / 2)和右子树的T(n / 2)和' 1'用于验证基本情况。

简化(1)你可以证明遍历(无论是顺序还是预订或后序)是O(n)的顺序。

答案 3 :(得分:5)

Travesal对于任何订单都是O(n) - 因为您每次点击一个节点。如果树具有某种组织模式(即二叉搜索树),则查找可以小于O(n)。

答案 4 :(得分:1)

简介

今天在课堂上有人问我这个问题,这是一个很好的问题!我将在此处进行解释,并希望在错误的地方对我的更正式答案进行审查或纠正。 :)

以前的答案

@Assaf的观察也是正确的,因为二叉树遍历会递归地访问每个节点一次。

但是,由于它是递归算法,因此您通常必须使用更高级的方法来分析运行时性能。当处理顺序算法或使用for循环的算法时,使用求和通常就足够了。因此,下面是对好奇者进行此分析的更详细说明。

复发

如前所述,

T(n)= 2 * T(n / 2)+1

其中T(n)是遍历算法中执行的操作数(顺序,前顺序或后顺序没有区别。

重复说明

有两个 T(n),因为有序遍历,预排序遍历和后置遍历遍历在左右子节点上。因此,将每个递归调用都视为 T(n)。换句话说,**左T(n / 2)+右T(n / 2)= 2 T(n / 2)**。 “ 1”来自功能内的任何其他恒定时间操作,例如打印节点值等。 (坦白地说,它可以是1或任何常数,并且渐近运行时仍将计算为相同的值。以下说明。)

分析

实际上,可以使用大师定理使用大theta分析这种重复。所以,我将在这里应用它。

T(n)= 2 * T(n / 2)+常数

常量是某个常量(可以是1或任何其他常量)。

使用Masters' Theorem,我们有 T(n)= a * T(n / b)+ f(n)

所以, a = 2,b = 2,f(n)=常量,因为 f(n)= n ^ c = 1 ,所以得出< strong> c = 0 ,因为 f(n)是常数。

从这里,我们可以看到 a = 2 b ^ c = 2 ^ 0 = 1 。因此, a> b ^ c 2> 2 ^ 0 。因此, c 0

从这里我们有T(n)= BigTheta(n ^ {logb(a)})= BigTheta(n ^ 1)= BigTheta(n)

如果您不熟悉BigTheta(n),它与 O(n)是“相似的”(请忍受我:)),但这是“更严格的约束”或更严格的近似运行时。因此, BigTheta(n)既是最坏情况的 O(n),也是最好情况下的 BigOmega(n)运行时。 / p>

我希望这会有所帮助。保重。

答案 5 :(得分:1)

二叉树的深度优先遍历为O(n)。

Algo -- <b>
    PreOrderTrav():-----------------T(n)<b>
    if root is null---------------O(1)<b>
      return null-----------------O(1)<b>
    else:-------------------------O(1)<b>
      print(root)-----------------O(1)<b>
      PreOrderTrav(root.left)-----T(n/2)<b>
      PreOrderTrav(root.right)----T(n/2)<b>

如果算法的时间复杂度为T(n),则可以写为T(n)= 2 * T(n / 2)+ O(1)。 如果应用反向替换,我们将得到T(n)= O(n)。

答案 6 :(得分:0)

T(n)= 2T(n / 2)+ c

T(n / 2)= 2T(n / 4)+ c => T(n)= 4T(n / 4)+ 2c + c

类似地,T(n)= 8T(n / 8)+ 4c + 2c + c

....

....

最后一步... T(n)= nT(1)+ c(2的幂的和从0到h(树的高度))

所以复杂度是O(2 ^(h + 1)-1)

但是h = log(n)

所以,O(2n-1)= O(n)

答案 7 :(得分:-1)

考虑一个倾斜的二叉树,其中有3个节点,分别是7、3、2。对于像搜索2这样的任何操作,我们都必须遍历3个节点,也要删除2个,就必须遍历3个节点,并且还要插入1个节点,我们必须遍历3个节点。因此,二叉树的最坏情况复杂度为O(n)。