从序遍历和预序遍历构造二叉树的时间复杂性
Time complexity of construction of a binary tree from inorder and preorder traversals
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²)
相关文章:
- 二叉树级别顺序遍历在leetcode中
- 使用二叉树的关卡顺序概念的垂直顺序遍历
- 之字折线二叉树遍历C++
- 二叉树级别顺序遍历 LeetCode
- 如何修复关卡顺序遍历问题(二叉树)的无限循环错误
- 二叉树顺序遍历在C++
- C++,如何创建和绘制二叉树,然后按预购方式遍历它
- 二叉树顺序遍历错误:没有用于调用的匹配函数
- 基于矢量的二叉树遍历
- 这种遍历二叉树的递归方法在一些递归后崩溃!为什么?
- 如何遍历二叉树并在不传递值的情况下计算值的出现次数
- 使用递归的顺序二叉树遍历与使用堆栈的优缺点
- 使用递归的顺序和预序遍历 - 二叉搜索树 C++
- 遍历二叉搜索树C++
- 从序遍历和预序遍历构造二叉树的时间复杂性
- 使用级别顺序遍历将节点插入二叉树
- 递归后序遍历解除分配二叉树节点
- 遍历二叉树的函数
- 无法使用非递归顺序方法遍历二叉树
- 是否可以使用迭代而不是递归来遍历二叉树?