从序遍历和预序遍历构造二叉树的时间复杂性

Time complexity of construction of a binary tree from inorder and preorder traversals

本文关键字:遍历 二叉树 时间复杂性      更新时间:2023-10-16

Given这里是从有序遍历和预序遍历构建树的代码。我不知道他们是如何达到O(n^2)时间复杂性的。有什么想法吗?我看到在有序序列中搜索索引将是O(n),其余部分是如何计算的?

O(N^2)的复杂性源于这样一个事实,即对于预序遍历中的每个项(其中有N),您必须在Inorder遍历中搜索其分区(同样有N)。

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

以他们给出的例子为例,进行以下遍历(Inorder然后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

这是最坏的情况,您可以看到,网格中有N*N位置需要检查。因此,在最坏的情况下,存在N*N时间复杂性。

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

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

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

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