Time complexity 二叉树遍历的复杂性

Time complexity 二叉树遍历的复杂性,time-complexity,Time Complexity,数据结构中二叉树的顺序、后序和前序遍历的时间复杂度是多少??是O(n)还是O(logn)还是O(n^2) O(n),因为每个节点遍历一次。或者更确切地说,您为每个节点所做的工作量是恒定的(不取决于其余节点)。对于任何顺序,Travesal都是O(n)-因为您只对每个节点执行一次操作。如果树具有某种组织模式(即二叉搜索树),则查找可以小于O(n)。O(n),我会说。 我所做的是一棵平衡树,适用于所有的树。 假设使用递归 T(n)=2*T(n/2)+1------>(1) T(n/2)表示左子树,T

数据结构中二叉树的顺序、后序和前序遍历的时间复杂度是多少??是O(n)还是O(logn)还是O(n^2)

O(n),因为每个节点遍历一次。或者更确切地说,您为每个节点所做的工作量是恒定的(不取决于其余节点)。

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

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

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

T(n/2)表示左子树,T(n/2)表示右子树,而“1”表示验证基本情况


在简化(1)时,您可以证明遍历(按序、按前序或按后序)的顺序为O(n)。

按序、按前序和按后序遍历都是深度优先遍历

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

因为二叉树也是一个图,所以这里也同样适用。 每个深度优先遍历的复杂度都是O(n+m)

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

然后复杂性变成O(n+n-1),也就是O(n)。

我今天在课堂上被问到这个问题,这是一个好问题!我会在这里解释,希望我的更正式的答案得到审查或纠正哪里是错误的。:)

先前的答案 @Assaf的观察结果也是正确的,因为二叉树遍历递归地访问每个节点一次

但是!,因为它是一种递归算法,所以您通常必须使用更高级的方法来分析运行时性能。在处理顺序算法或用于循环的算法时,使用求和通常就足够了。因此,对于那些好奇的人来说,下面是对这一分析的更详细的解释

复发 如前所述

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

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

复发原因的解释 有两个T(n),因为按序、前序和后序遍历都在左、右子节点上调用自己。因此,将每个递归调用看作一个T(n)。换句话说,**左T(n/2)+右T(n/2)=2T(n/2)**。“1”来自函数中的任何其他常量时间操作,如打印节点值等。(它可以是1或任何常量&渐近运行时仍然计算为相同的值。解释如下。)

分析 这个循环实际上可以用大θ,马斯特斯定理来分析。所以,我将在这里应用它

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

其中常数是某个常数(可以是1或任何其他常数)

使用
T(n)=a*T(n/b)+f(n)

因此,a=2,b=2,f(n)=常数,因为f(n)=n^c=1,所以它得出c=0,因为f(n)是常数

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

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

如果您不熟悉BigTheta(n),那么它与O(n)是“相似的”(请注意:)),但它是一个“更紧的界限”或更紧的运行时近似值。因此,BigTheta(n)既是最坏情况下的O(n),也是最佳情况下的BigOmega(n)运行时

我希望这有帮助。小心点。

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)

考虑一个有3个节点的倾斜二叉树,即7,3,2。对于搜索2这样的任何操作,我们必须遍历3个节点;对于删除2,我们必须遍历3个节点;对于插入1,我们必须遍历3个节点。因此,二叉树的最坏情况复杂性为O(n)。

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

Algo--
PreOrderTrav():--------------T(n)
如果root为null------------------O(1)
返回null-----------------O(1)
其他:----------------------------O(1)
打印(根)-O(1)
预订单RAV(左根)---T(n/2)
预订单RAV(右根)-T(n/2)
如果算法的时间复杂度是T(n),那么它可以写成T(n)=2*T(n/2)+O(1)。
如果我们应用回代,我们将得到T(n)=O(n)。

哪些数据结构?树?什么类型的树?这个问题属于@CommanderZ-我们不要开始分裂头发。如果我在递归中执行
后序
,那么它的复杂性是什么?@Software\u t-为什么这很重要?对我来说,这个答案似乎不正确,因为你假设树在左右两侧均匀地分成两半。
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>