从inorder和preorder遍历构造二叉树的时间复杂度

时间:2014-01-04 15:40:24

标签: c++ c algorithm

给定Here是从inorder和preorder遍历构造树的代码。我无法弄清楚他们是如何达到O(n ^ 2)时间复杂度的。有任何想法吗?我看到在顺序序列中搜索索引将是O(n),其余部分是如何计算的?

3 个答案:

答案 0 :(得分:6)

O(N^2)复杂性的结果是,对于Preorder遍历中的每个项目(其中有N),您必须在Inorder遍历中搜索其分区,(同样有N这些)。

粗略地说,您可以将此算法视为将节点放置在网格上,其中Inorder遍历提供x坐标,Preorder遍历提供y坐标:

以他们给出的示例为例,进行以下遍历(Inorder then Preorder):

Inorder: DBEAFC
Preorder: ABDECF

现在这是他们正在使用的网格:

     D    B    E    A    F    C
A    +    +    +    A    |    |
     |    +--------------+    |
B|F  +    B    |         F    |
     +---------+         -----+
DE|C D         E              C

现在,算法需要知道网格中放置每个节点的位置,只需将节点放在网格中x和y坐标相同的位置即可。

在这种情况下看起来网格的大小实际上是NlogN,这会导致遍历网格的NlogN复杂度(因此NlogN时间复杂度为Inorder: DBEAFC Preorder: DBEAFC D B E A F C D D | | | | | -----+ | | | | B B | | | | -----+ | | | E E | | | -----+ | | A A | | -----+ | F F | -----+ C C 算法)这棵树是平衡的。在最坏的情况下,您的树实际上可能是一个链表。

E.g。考虑这个树,其中preorder和inorder遍历是相同的:

N*N

这是最糟糕的情况,你看,网格中有N*N个位置需要检查。因此,在最坏的情况下,时间复杂度为{{1}}。

答案 1 :(得分:0)

您正在遍历递归内的整个preorder数组,并且在每个堆栈帧中搜索inorder遍历数组中的数字。所以O(N*N) = o(N^2)

答案 2 :(得分:0)

您绝对正确,因为在有序数组中进行搜索将花费O(n)时间

在最坏的情况下,T(n)= T(n-1)+ O(n)

解决这个问题,我们得到T(n)= O(n²)