数据结构中二进制树的inorder,postorder和preorder遍历的时间复杂度是多少?是O(n)还是O(log n)还是O(n ^ 2)?
答案 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)
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
从这里我们有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)。